- 在线时间
- 480 小时
- 最后登录
- 2026-6-1
- 注册时间
- 2023-7-11
- 听众数
- 4
- 收听数
- 0
- 能力
- 0 分
- 体力
- 7823 点
- 威望
- 0 点
- 阅读权限
- 255
- 积分
- 2934
- 相册
- 0
- 日志
- 0
- 记录
- 0
- 帖子
- 1174
- 主题
- 1189
- 精华
- 0
- 分享
- 0
- 好友
- 1
该用户从未签到
 |
clear all
, s, j1 S0 C. y j, g* V3 Oclc" M4 S3 Z6 H* K, v& M' r
maze=[0,0,0,0,0,0,0,0;$ P& H8 i' O4 M4 _2 F
0,1,1,1,1,0,1,0;
+ C, K7 `/ ?4 k1 Q& b5 H 0,0,0,0,1,0,1,0;
8 d6 P. c7 Q+ _ 0,1,0,0,0,0,1,0;0 z x! K9 ]) Y, T/ @/ I
0,1,0,1,1,0,1,0;
9 G+ _6 x$ f1 O" Q 0,1,0,0,0,0,1,1;: z0 {- @' o. t
0,1,0,0,1,0,0,0;
& a" n, O- h6 v: y2 r/ U( j9 F 0,1,1,1,1,1,1,0];%迷宫:0为路,1为墙,-1为遍历过
) v/ H+ g. I" dfx(1:4)=[1,-1,0,0];4 X5 _# k2 G C0 N) K
fy(1:4)=[0,0,-1,1];' _( [- X4 y5 v' I( }
sq.pre=zeros(1,100);sq.x=zeros(1,100);sq.y=zeros(1,100);6 U _: ^6 p, p8 ~" u* a
qh=0;%队头指针
- o2 ~7 r1 r5 {; Aqe=1;%队尾指针
; N- H1 g4 e' p. ^1 p+ Q$ ?maze(1,1)=-1;
4 |4 b% e. S% [" f, Y%第一个元素入队- D# w! R c! V
sq.pre(1)=0;sq.x(1)=1;sq.y(1)=1;
- j* G) `: }& H4 c& n
) Q6 |3 @3 T8 B9 zwhile qh-qe~=09 [9 Z3 v/ ]4 T; d9 @' Y3 n
qh=qh+1;1 D+ A0 u& R! e/ b
bb=0;
9 `# q3 v, k4 u; h, x$ |9 a) [for k=1:4
6 v4 P1 n5 X* ^4 @# K9 `4 ji=sq.x(qh)+fx(k);+ z+ Y9 x& A. N3 e+ P
j=sq.y(qh)+fy(k);
8 W1 W9 N9 G; q+ b5 p0 yif check(i,j,maze)==1
Z2 D y; M W) G+ mqe=qe+1;%入队2 g' \3 o) E& ]% p5 l4 V6 }/ h& x
sq.x(qe)=i;sq.y(qe)=j;sq.pre(qe)=qh;7 e! B4 ]' B# _" }1 C
maze(i,j)=-1;, \5 Z* N. |2 J/ ~/ d; b
5 M& K; `( c$ ]( `6 f/ U P( A, w
if i==8&j==8%如果为图最后一个点
I$ q2 f% K0 O p- a1 ?while qe~=0- n4 e# A, u1 Q
sq.x(qe)
3 a o7 q- V/ }sq.y(qe)
0 F/ Q/ L1 H" T7 r: dqe=sq.pre(qe);# I5 g Q$ |: m, s( n# h+ ]
end
- L( `% V+ e1 L h/ {- S& pbb=1;
9 j# n( ~% x6 V- Vbreak;$ G; f3 n! T! g- n# {% R
end %if
) o, b' _: i& O: n+ N/ oend %if
( [0 ]8 P2 L. f$ D* bend
, s W- E# t8 x3 Kif bb==11 t. Y8 |3 J; ?; r
break: K* k- B P. i+ a3 J: O9 ]
end4 b) Y/ r d5 ^$ D6 i9 H
end%while
5 j9 z, F4 M; U% \0 |' E# e6 s
3 A, Z- G& ?1 z5 D! m8 b这段代码实现了一个广度优先搜索(BFS)算法,用于找到迷宫中从起点 (1,1) 到终点 (8,8) 的最短路径。2 ]$ H: g1 v9 K: l# h
以下是代码的详细解释:
4 g; n7 [9 u$ W5 R$ \5 U* z9 Q9 i) T0 G; Y
1.迷宫定义:5 F1 W' ^: C. X
2.maze 是一个8x8的矩阵,其中 0 表示可通行的路径,1 表示墙,-1 表示已经遍历过的路径。
3 `1 G" m4 ~2 S- E) W g3.方向定义:
4 ]1 X9 X/ P$ ]4.fx 和 fy 定义了四个方向,即上、下、左、右的偏移量。% {$ w$ X1 r& w, A( N' F* {5 I5 |0 B
5.队列定义:
; T( a' ?: z- d" E6.sq.pre, sq.x, sq.y 分别用于存储每个点的前一个点、x坐标和y坐标。
4 V c0 _ J# o$ H7.qh 和 qe 分别是队列的头和尾的指针。
0 S/ N; `& M+ w. e$ t! @3 J8.初始设置( G4 b' e. M( ?) Y$ R7 A m' f3 V8 B% L( j
9.起点 (1,1) 被标记为 -1(已遍历),并加入队列。% Y8 N% W: S- [* \$ u8 C9 P
10.广度优先搜索:' Y2 x, h" s1 p' r$ M9 ~6 ]3 }
11.使用一个 while 循环来进行搜索,直到队列为空。
( w4 @* f0 W4 U- n" i1 K I1 N- ?12.在每一轮中,取出队头的点 (sq.x(qh), sq.y(qh)),然后尝试向四个方向移动。: ~. x U$ \/ V; c! y) Z
13.对于每个方向,如果新的坐标 (i, j) 是有效的(即在迷宫范围内且没有被遍历过),则将其标记为 -1(已遍历)并加入队列。8 f0 }0 i5 [, W0 j3 ?+ _9 Y( Y
14.如果新的坐标是终点 (8,8),则从队列的尾部开始,回溯找到从终点到起点的路径。
1 t- F8 N3 [5 l( E9 U F15.回溯路径:
a# K* B& u2 ?( @16.如果找到终点,那么从 qe 开始,通过 sq.pre 数组回溯每个点的前一个点,直到回到起点。
" a, h" Y2 H3 t$ K这样,当代码执行完成后,sq.x 和 sq.y 的值将表示从起点到终点的最短路径。6 Z5 l* I9 K, ^: M4 u4 p' t' K
# Q& O/ {* V3 I5 C# j
5 o1 O( k1 L- c' T! [6 q& z B
|
zan
|