QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 2078|回复: 0
打印 上一主题 下一主题

广度优先搜索 找到迷宫中的最短路径

[复制链接]
字体大小: 正常 放大

1188

主题

4

听众

2931

积分

该用户从未签到

跳转到指定楼层
1#
发表于 2023-12-22 15:52 |只看该作者 |倒序浏览
|招呼Ta 关注Ta
clear all/ S  w  g4 M  ~1 p* s
clc
. c. m( N' y; @) {: Mmaze=[0,0,0,0,0,0,0,0;
8 ]5 }$ i' Z+ k5 \      0,1,1,1,1,0,1,0;
- j1 A+ o  ^' \6 a/ j" e      0,0,0,0,1,0,1,0;
& s% l5 \% \8 m. I2 ~2 l8 _      0,1,0,0,0,0,1,0;
  }8 ]& G( r' t4 l6 C! i" W7 ~2 M      0,1,0,1,1,0,1,0;
  @7 d* U+ C* m7 D( q      0,1,0,0,0,0,1,1;
4 Y" y- b( k& |      0,1,0,0,1,0,0,0;
6 Q: B1 s4 Q- j( L  a) V1 k+ [) O      0,1,1,1,1,1,1,0];%迷宫:0为路,1为墙,-1为遍历过; r+ t) X0 b5 i& L  c$ D8 Z% ]& ^+ |
fx(1:4)=[1,-1,0,0];& b0 t0 x$ _9 Y' U* x) x
fy(1:4)=[0,0,-1,1];! F  {* L( e4 ?* l
sq.pre=zeros(1,100);sq.x=zeros(1,100);sq.y=zeros(1,100);
2 d! t# g+ s9 p+ |' l( Z: \qh=0;%队头指针/ p+ o7 D- U2 n6 ?8 @* p& y
qe=1;%队尾指针0 V+ `5 @1 C8 @, f' ?0 g
maze(1,1)=-1;" D# I  N) U" R1 {+ K
%第一个元素入队
- x& C8 n5 {2 L9 nsq.pre(1)=0;sq.x(1)=1;sq.y(1)=1;! H! E. |! [3 k8 s: @

8 g  L: Z; F4 o7 Cwhile qh-qe~=0
  j; q6 I/ e, U" H# `  cqh=qh+1;% S: _% j! f: ?, @; D0 o, [% e
bb=0;
$ h& b1 ~* ~* O$ Z( f& d2 kfor k=1:4" w, i! O2 z% b. o9 r8 l0 {
i=sq.x(qh)+fx(k);
1 b8 V* G* T% R5 `' p. p6 W! sj=sq.y(qh)+fy(k);, g/ Q8 \. t3 L6 m
if check(i,j,maze)==1$ C0 g1 Y' \# v! G
qe=qe+1;%入队8 \& i5 P- x  J6 R2 G6 ~6 ~6 Q
sq.x(qe)=i;sq.y(qe)=j;sq.pre(qe)=qh;8 H( d* E0 C! z/ R; R5 Q* g0 t7 Z
maze(i,j)=-1;: `8 N' H0 z0 z7 w
* X% I' k8 l: e% Z3 D; ?/ @
if i==8&j==8%如果为图最后一个点8 t7 ]0 T/ [. m! S" y
while qe~=0$ ]8 a1 q4 }/ r
sq.x(qe) 3 C; F# ~& _( R
sq.y(qe)    4 O# i: t- G" X: F0 |- |- G
qe=sq.pre(qe);
' o' |8 j9 k/ t* gend
/ S0 B) |- U  g8 u: N/ ibb=1;
1 ^4 P9 ]% p; A0 F0 B/ C7 n6 abreak;
8 S+ Q2 y6 e2 r& X8 R1 l1 ]1 Wend %if
: Q0 \; [1 x5 N9 z% l0 K! |! _, f, Vend %if
, T3 _' o$ C2 S, C3 Y# F, Fend
8 `- V# \. v% N) L! R2 h. {if bb==1
5 }; z, H3 e0 o8 |, X; u- Ybreak# O/ H/ H/ t! `% Q
end5 r1 K3 H' |% Q
end%while1 {  O" P3 c- ^4 `
6 }+ v8 p5 z& U8 e
6 i9 f7 Z% A* P; \
这段代码实现了一个广度优先搜索(BFS)算法,用于找到迷宫中从起点 (1,1) 到终点 (8,8) 的最短路径。' \! }( Z# @9 y7 `: t0 P5 H3 T
以下是代码的详细解释:
  e8 M% ]" [9 E
9 z2 A! d7 Z3 \8 V# T: U1.迷宫定义:# x7 k* s  g, Y
2.maze 是一个8x8的矩阵,其中 0 表示可通行的路径,1 表示墙,-1 表示已经遍历过的路径。
) K1 s* m+ A: v4 k3.方向定义:
% j5 E0 k7 B0 E2 E1 Z& v0 R4.fx 和 fy 定义了四个方向,即上、下、左、右的偏移量。' }& @% F8 i, L! Y/ @
5.队列定义:+ v& \6 a, |1 y$ Z  f
6.sq.pre, sq.x, sq.y 分别用于存储每个点的前一个点、x坐标和y坐标。- l1 X8 j( r2 |. z; S
7.qh 和 qe 分别是队列的头和尾的指针。. o3 u7 Q! ?+ k2 o, n4 {* O
8.初始设置
7 z* k8 n) }# o+ o9.起点 (1,1) 被标记为 -1(已遍历),并加入队列。0 ?, M# D1 K+ x7 Z& ]1 I7 u0 {
10.广度优先搜索:
, V' L4 p, y5 o8 z( |6 c11.使用一个 while 循环来进行搜索,直到队列为空。
, j9 V, L4 Z! i# W12.在每一轮中,取出队头的点 (sq.x(qh), sq.y(qh)),然后尝试向四个方向移动。8 Y# p- S, i! g/ y5 h; e4 M0 O, U( R
13.对于每个方向,如果新的坐标 (i, j) 是有效的(即在迷宫范围内且没有被遍历过),则将其标记为 -1(已遍历)并加入队列。
8 Y4 @7 w+ v) u14.如果新的坐标是终点 (8,8),则从队列的尾部开始,回溯找到从终点到起点的路径。
, A) g3 c" }" o# z5 g15.回溯路径:
0 S7 s9 I! i; o5 }16.如果找到终点,那么从 qe 开始,通过 sq.pre 数组回溯每个点的前一个点,直到回到起点。# O# T) Q8 R9 N! }, b" V
这样,当代码执行完成后,sq.x 和 sq.y 的值将表示从起点到终点的最短路径。) e2 o+ S0 ^8 H1 ~8 }

) Y/ E- l) w/ k
2 D7 s$ h, S, \+ B8 u. t

广度优先搜索.rar

736 Bytes, 下载次数: 0, 下载积分: 体力 -2 点

售价: 2 点体力  [记录]  [购买]

zan
转播转播0 分享淘帖0 分享分享0 收藏收藏0 支持支持0 反对反对0 微信微信
您需要登录后才可以回帖 登录 | 注册地址

qq
收缩
  • 电话咨询

  • 04714969085
fastpost

关于我们| 联系我们| 诚征英才| 对外合作| 产品服务| QQ

手机版|Archiver| |繁體中文 手机客户端  

蒙公网安备 15010502000194号

Powered by Discuz! X2.5   © 2001-2013 数学建模网-数学中国 ( 蒙ICP备14002410号-3 蒙BBS备-0002号 )     论坛法律顾问:王兆丰

GMT+8, 2026-5-26 05:07 , Processed in 0.511728 second(s), 55 queries .

回顶部