- 在线时间
- 479 小时
- 最后登录
- 2026-5-9
- 注册时间
- 2023-7-11
- 听众数
- 4
- 收听数
- 0
- 能力
- 0 分
- 体力
- 7813 点
- 威望
- 0 点
- 阅读权限
- 255
- 积分
- 2931
- 相册
- 0
- 日志
- 0
- 记录
- 0
- 帖子
- 1173
- 主题
- 1188
- 精华
- 0
- 分享
- 0
- 好友
- 1
该用户从未签到
 |
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 |
zan
|