- 在线时间
- 469 小时
- 最后登录
- 2025-8-1
- 注册时间
- 2023-7-11
- 听众数
- 4
- 收听数
- 0
- 能力
- 0 分
- 体力
- 7561 点
- 威望
- 0 点
- 阅读权限
- 255
- 积分
- 2848
- 相册
- 0
- 日志
- 0
- 记录
- 0
- 帖子
- 1160
- 主题
- 1175
- 精华
- 0
- 分享
- 0
- 好友
- 1
该用户从未签到
 |
clear all
& O; F7 p- T- m) A4 Q' pclc
) P& U; j, f: U( x. l' L9 C( h$ Wmaze=[0,0,0,0,0,0,0,0;
2 ]/ ^ G5 x; o( K 0,1,1,1,1,0,1,0;# T- N7 v: R' Z M/ Q
0,0,0,0,1,0,1,0;" m7 r& a; I# F( Y0 X* P0 V$ }
0,1,0,0,0,0,1,0;* K- |0 @, Y) K' f! t7 j, q
0,1,0,1,1,0,1,0;" U" V* d6 ?3 S- Y e! E
0,1,0,0,0,0,1,1;
3 M0 b @! n; e @ 0,1,0,0,1,0,0,0;
3 K+ ]. M" Z" x+ X* W3 p( x7 O3 j 0,1,1,1,1,1,1,0];%迷宫:0为路,1为墙,-1为遍历过! }/ r+ }1 j3 R
fx(1:4)=[1,-1,0,0];
7 y, R: z% G# I/ Hfy(1:4)=[0,0,-1,1];% O- H$ ~- N9 t. H z" r
sq.pre=zeros(1,100);sq.x=zeros(1,100);sq.y=zeros(1,100);
! e( ]: a, Q6 J$ T% hqh=0;%队头指针) X# n) l7 K+ A) v0 W8 G
qe=1;%队尾指针 I1 h" I' Y0 ~7 s
maze(1,1)=-1;
; U+ H* ^0 K; w# D' n Z5 g%第一个元素入队! s# R* O8 i( ` a( `4 `9 D: [+ `
sq.pre(1)=0;sq.x(1)=1;sq.y(1)=1;
2 I: ~! K8 i/ L
7 x* }& o" E$ Vwhile qh-qe~=0
1 j/ U' ~6 n& Hqh=qh+1;
% a! j6 d3 m0 [bb=0;
# h0 Y4 |. F$ \for k=1:4& I. m1 k7 c5 Y! [# b$ e
i=sq.x(qh)+fx(k);1 \ R5 V, h% n
j=sq.y(qh)+fy(k);6 W) J6 q* Q9 M3 M
if check(i,j,maze)==1
7 G5 Z1 Q- t/ p" ^9 fqe=qe+1;%入队
; _) Q% n" Q* ^2 Ksq.x(qe)=i;sq.y(qe)=j;sq.pre(qe)=qh;" v" u% | m( }/ O
maze(i,j)=-1;9 G; [9 [1 H# ~7 ]2 v
; H, d) E) H+ f' ^& @
if i==8&j==8%如果为图最后一个点' L1 v a+ h/ N$ i
while qe~=0
/ d, z% ^: Z8 W$ y' xsq.x(qe)
5 q) A( n0 M: p6 I/ u! msq.y(qe)
; a" V$ t6 ~2 ]' c# ~5 `qe=sq.pre(qe);( W( b+ [% k3 }6 ^& z* E5 n
end % n4 R, r2 j9 T3 K% l; o
bb=1;, j# i7 o- \1 s$ v w
break;" T! k% I5 t% V2 o" u! p
end %if
/ l6 s" @1 C& E4 V0 h$ m Wend %if
1 w% W( g4 R& K3 w7 o8 J& V& `end, [$ D* b- {9 h6 I7 o2 K6 T# V" t
if bb==14 k9 [0 \2 ?' l
break
5 U" f) l! N; P3 \! Zend
/ q* R( e6 r7 q" h* b- l, b' rend%while
: I8 M! d0 s! p( b" f6 f/ w0 }; a
& m$ E1 u6 E/ y* N1 i3 @3 A
- ~3 { K# E1 K9 ]/ E这段代码实现了一个广度优先搜索(BFS)算法,用于找到迷宫中从起点 (1,1) 到终点 (8,8) 的最短路径。
; N- V a7 q8 E# D8 g4 s以下是代码的详细解释:" X# d4 ?: w' ^; e
+ g0 o$ I' m4 d9 h& [1.迷宫定义:
- m$ @$ f/ F9 F& k- d# Z2.maze 是一个8x8的矩阵,其中 0 表示可通行的路径,1 表示墙,-1 表示已经遍历过的路径。
: ^# ~1 c5 {1 w' h+ o3.方向定义:* F4 `' U, a- i+ [7 ]
4.fx 和 fy 定义了四个方向,即上、下、左、右的偏移量。
4 N. w8 ?1 A+ T5.队列定义:5 e6 K0 x3 X! _# p
6.sq.pre, sq.x, sq.y 分别用于存储每个点的前一个点、x坐标和y坐标。
: a3 _1 {5 o# T' T f7.qh 和 qe 分别是队列的头和尾的指针。6 M" F! R0 W k: S5 A
8.初始设置1 B1 F' E" V0 A% U6 e. n
9.起点 (1,1) 被标记为 -1(已遍历),并加入队列。
" Y0 l! W. i2 P$ s& u10.广度优先搜索:
; y; V9 ~2 F& x) I) F, A# B0 z0 U11.使用一个 while 循环来进行搜索,直到队列为空。
) {2 y! Q" ?0 R- x0 b) G' J12.在每一轮中,取出队头的点 (sq.x(qh), sq.y(qh)),然后尝试向四个方向移动。
8 h3 N6 N4 d w3 F( N( D! ?+ x13.对于每个方向,如果新的坐标 (i, j) 是有效的(即在迷宫范围内且没有被遍历过),则将其标记为 -1(已遍历)并加入队列。9 T: w- }' B+ n/ k. y4 j
14.如果新的坐标是终点 (8,8),则从队列的尾部开始,回溯找到从终点到起点的路径。, w" B6 ^4 i: M% K0 b
15.回溯路径:$ }' V H8 h4 B4 E! i
16.如果找到终点,那么从 qe 开始,通过 sq.pre 数组回溯每个点的前一个点,直到回到起点。+ P8 p1 k3 |! Y# Z
这样,当代码执行完成后,sq.x 和 sq.y 的值将表示从起点到终点的最短路径。
* L+ I$ X. T6 b
" T7 x9 W1 _9 I- \$ e. z! w$ V: |- Q" g
|
zan
|