- 在线时间
- 482 小时
- 最后登录
- 2026-9-11
- 注册时间
- 2023-7-11
- 听众数
- 4
- 收听数
- 0
- 能力
- 0 分
- 体力
- 7953 点
- 威望
- 0 点
- 阅读权限
- 255
- 积分
- 2978
- 相册
- 0
- 日志
- 0
- 记录
- 0
- 帖子
- 1183
- 主题
- 1198
- 精华
- 0
- 分享
- 0
- 好友
- 1
该用户从未签到
 |
clear all
2 G3 f8 ~' U; Y4 R; aclc
- P2 o9 P$ S" v: r4 r) K& kmaze=[0,0,0,0,0,0,0,0;/ v9 G5 S: C: f& D4 i3 y
0,1,1,1,1,0,1,0;# Y& V2 u Q7 M, {0 `% i
0,0,0,0,1,0,1,0;6 K" N i+ h, y7 E
0,1,0,0,0,0,1,0;
0 H6 P# a: t* e; O5 Z 0,1,0,1,1,0,1,0;
7 }/ @) ~4 u2 ~, A0 [3 X% ]5 ~# K 0,1,0,0,0,0,1,1;
5 f! l* @4 d5 m. |1 a" f l( Z 0,1,0,0,1,0,0,0;! r) W" q% J/ F; o3 c/ i
0,1,1,1,1,1,1,0];%迷宫:0为路,1为墙,-1为遍历过# w, e5 q' x2 J. z
fx(1:4)=[1,-1,0,0];
2 O& T6 Y2 |% y0 {fy(1:4)=[0,0,-1,1];
8 f5 b" f2 L7 Wsq.pre=zeros(1,100);sq.x=zeros(1,100);sq.y=zeros(1,100);
* w8 Q8 H; T2 q) _3 r: P4 l8 [qh=0;%队头指针
2 |1 p) a5 t( P3 V8 m1 Tqe=1;%队尾指针
" T9 f; W' o( A. q% e6 Fmaze(1,1)=-1;
* L* v5 @6 O: e( R, a% D, p& d%第一个元素入队. h2 r/ N6 c x7 O2 Z' B
sq.pre(1)=0;sq.x(1)=1;sq.y(1)=1;
3 C" A; a5 b" p) y$ h
' \! ^: H' y) V2 K& ?' F& Nwhile qh-qe~=0
7 ?1 x9 }/ V" ]qh=qh+1;
& |( q* o8 t) c; [bb=0;
4 _* K4 J8 \/ ~3 h+ y" k5 d8 l2 qfor k=1:4( | A( @6 G1 E( R
i=sq.x(qh)+fx(k);
& @" A" \) t' H) xj=sq.y(qh)+fy(k);/ V) [% @# P# Y& P/ I5 @) v
if check(i,j,maze)==1. g9 j0 B0 }. r' b
qe=qe+1;%入队- n2 @$ r0 E* ]' l
sq.x(qe)=i;sq.y(qe)=j;sq.pre(qe)=qh;
5 N: D* }9 [7 N5 Gmaze(i,j)=-1;9 Z8 d2 e$ d9 w6 E: Z; Q
& P2 t+ k9 @3 o) ~; Vif i==8&j==8%如果为图最后一个点
, y7 o8 {. g' ~. T9 z* D) Wwhile qe~=00 P. ^2 s$ a( S4 ^
sq.x(qe) 9 X& p) e' p4 @9 I9 l
sq.y(qe) & B+ y# ]. H8 q$ z! Z3 h: ^8 q
qe=sq.pre(qe);
~" H! v3 X& o5 `, ~- W' \$ Wend
- B5 j: b8 G! T6 I- u* |bb=1;
% I3 q; q! _: P( m& M0 ebreak;
7 U1 X) V7 I" U; W0 b! p! z( V( R* G. @end %if
" j" }7 L- J* }4 ~) u$ Gend %if
7 w1 [. g( y! K, a' q& A5 T ]. send
( w" Z8 `, J7 y4 V& Vif bb==1- l" s6 b3 C9 C5 w# j; F
break, {8 s% P" v, t+ m$ W! Z/ M
end- n' u! @: t1 h* p ?, D
end%while
3 U: t1 a9 q" z8 R1 U
& ^; c: R$ c1 K& O9 j6 [/ y7 _" b6 D2 B' O: Y% G
这段代码实现了一个广度优先搜索(BFS)算法,用于找到迷宫中从起点 (1,1) 到终点 (8,8) 的最短路径。" I! L# c6 Q5 S
以下是代码的详细解释:
3 w1 Z! ~" v4 z# w
# c5 A2 X. [# d! t1.迷宫定义:
$ m- n! o$ U% p# l2.maze 是一个8x8的矩阵,其中 0 表示可通行的路径,1 表示墙,-1 表示已经遍历过的路径。8 \/ w/ J2 H6 W; w: K4 p
3.方向定义:
2 ]/ Y1 c/ D. H4.fx 和 fy 定义了四个方向,即上、下、左、右的偏移量。0 X$ V. m" X1 w) Q$ p
5.队列定义:
6 |* r- g" Q% b) K7 O6 I7 l6.sq.pre, sq.x, sq.y 分别用于存储每个点的前一个点、x坐标和y坐标。
+ E4 {' _; v: g5 D7.qh 和 qe 分别是队列的头和尾的指针。! F1 e; L( N" X) T3 y0 p: d) }- p G
8.初始设置7 R3 w8 J) S0 M
9.起点 (1,1) 被标记为 -1(已遍历),并加入队列。
; N' p7 K* P& n9 U6 G' u10.广度优先搜索:/ l8 o. h3 C( _1 d6 {2 D c
11.使用一个 while 循环来进行搜索,直到队列为空。
, r1 \# B2 Q$ s$ _. |, e2 G12.在每一轮中,取出队头的点 (sq.x(qh), sq.y(qh)),然后尝试向四个方向移动。
' b% Y1 j& i* r, k2 l- x# x- ~- l13.对于每个方向,如果新的坐标 (i, j) 是有效的(即在迷宫范围内且没有被遍历过),则将其标记为 -1(已遍历)并加入队列。
1 f }% {4 J, X" H6 X1 H! `14.如果新的坐标是终点 (8,8),则从队列的尾部开始,回溯找到从终点到起点的路径。
* M( H( I' e" K& h% }% l15.回溯路径:6 E6 }3 s# o0 t5 |4 N
16.如果找到终点,那么从 qe 开始,通过 sq.pre 数组回溯每个点的前一个点,直到回到起点。
6 i& t4 K$ `0 @4 H! n3 A% x9 p这样,当代码执行完成后,sq.x 和 sq.y 的值将表示从起点到终点的最短路径。2 w. ?: X0 y& ], n" W5 o
# A6 R8 c) E5 p" V, d& ^/ M! b2 x7 Q1 B, k# E# u( D% o0 `7 p
|
zan
|