- 在线时间
- 480 小时
- 最后登录
- 2026-6-1
- 注册时间
- 2023-7-11
- 听众数
- 4
- 收听数
- 0
- 能力
- 0 分
- 体力
- 7823 点
- 威望
- 0 点
- 阅读权限
- 255
- 积分
- 2934
- 相册
- 0
- 日志
- 0
- 记录
- 0
- 帖子
- 1174
- 主题
- 1189
- 精华
- 0
- 分享
- 0
- 好友
- 1
该用户从未签到
 |
clear all# c& y! L$ l( Z
clc, `- U. V# V- j2 m9 U5 ?9 r4 g
maze=[0,0,0,0,0,0,0,0;
0 W% a5 N; `1 ^ 0,1,1,1,1,0,1,0;
& h3 a8 h6 j. o1 i/ y 0,0,0,0,1,0,1,0;
3 @, [2 ` V0 _0 A. m 0,1,0,0,0,0,1,0;
" G" ]6 V2 f- x$ n: S7 y 0,1,0,1,1,0,1,0;# s! M1 w6 E: G4 M" S
0,1,0,0,0,0,1,1;
! j7 ]3 s2 }3 h2 h8 o$ \ 0,1,0,0,1,0,0,0;- Q; z+ _+ H8 \- x9 }
0,1,1,1,1,1,1,0];%迷宫:0为路,1为墙,-1为遍历过
4 U e% h' S, t# {! t* y2 [fx(1:4)=[1,-1,0,0];$ f" o. {5 d) h, S
fy(1:4)=[0,0,-1,1];1 q, h& ]9 Q6 h9 b. x7 a( G
sq.pre=zeros(1,100);sq.x=zeros(1,100);sq.y=zeros(1,100);; @9 f+ B3 [5 ^% K# x
qh=0;%队头指针
; H5 w" w( e/ n6 ^: zqe=1;%队尾指针
3 _) k* ~$ P9 P# wmaze(1,1)=-1;
Q( u) s" j0 a+ }1 e4 j%第一个元素入队, C. R* e! Z" J2 _ y+ k
sq.pre(1)=0;sq.x(1)=1;sq.y(1)=1; I; k) b% Q+ ]! w3 A
8 o) p; e& @/ l' L* Z
while qh-qe~=0* L2 y8 K! O" Z4 L/ g/ C1 B h4 l
qh=qh+1;! {: O: r8 Z4 f7 X2 |& V! I
bb=0;
; y+ c9 O. W* H `for k=1:46 m. W& |% I; k, u* u+ L0 f1 L$ }) o5 t& U
i=sq.x(qh)+fx(k);# T- e2 t$ w5 ?4 U- _
j=sq.y(qh)+fy(k);
, P H! k! w; [6 G+ t( I2 Hif check(i,j,maze)==1% l4 n: Z r# |4 I# G4 ]$ K( W
qe=qe+1;%入队
) Y- U6 [% b* Xsq.x(qe)=i;sq.y(qe)=j;sq.pre(qe)=qh;, f3 @5 r, J+ M& q( z
maze(i,j)=-1;
2 N3 T4 ^- B2 H7 P+ b- `, P3 \0 G5 w
" f Y8 Q! z: J5 ]: }, I. Mif i==8&j==8%如果为图最后一个点
% N- \ \2 e- L) R& {( q; f+ Dwhile qe~=0- p4 e4 ~* z/ h; U5 [ g
sq.x(qe)
6 Q0 C3 L- W) |/ `, g, psq.y(qe) / T' K- A1 f( I* V9 N
qe=sq.pre(qe);7 b, K2 }' E" @& y( q, c6 ?- A
end
9 ]3 U( ^4 q1 p/ a1 s) T+ Gbb=1;
+ J6 O2 `6 F# n6 f, p7 T3 e6 tbreak;
% D% m# o ^8 z+ q+ ]$ K1 Dend %if; z& Y# G' I* t T
end %if
7 k8 D7 p2 l8 F* E& lend; a; i9 @' k2 [$ `- v
if bb==1
$ Y+ Z: |6 V# v9 y2 C4 U$ Abreak4 g8 O+ \$ ?! x, v( a T8 K
end
( ^) u7 Q! @* E G0 J2 y2 mend%while
* y* u2 v. b- q: f( c
3 d- C0 u3 ^' F; |3 a- j
2 v" s! ^8 V# }1 V: _这段代码实现了一个广度优先搜索(BFS)算法,用于找到迷宫中从起点 (1,1) 到终点 (8,8) 的最短路径。 }: X6 i6 m8 O: T- y5 M6 ~: |3 w- S
以下是代码的详细解释:% G: K! M, ]% y% m P6 z6 A5 d
. c+ f, E; O9 x8 K) S% G6 P1.迷宫定义:. c; D5 Y$ @% t9 K7 e9 B
2.maze 是一个8x8的矩阵,其中 0 表示可通行的路径,1 表示墙,-1 表示已经遍历过的路径。% o( B/ ~8 v6 E) y: ~' V' X
3.方向定义:- S" d. q" U4 T4 k( o
4.fx 和 fy 定义了四个方向,即上、下、左、右的偏移量。, M0 `: v0 P& k: d5 n
5.队列定义:9 q9 Q) e: s8 _3 S9 \7 O
6.sq.pre, sq.x, sq.y 分别用于存储每个点的前一个点、x坐标和y坐标。
! o$ A k" l8 U! q- l) n7.qh 和 qe 分别是队列的头和尾的指针。0 [& f* v1 W2 s( Y, a& e# C7 s7 d9 y
8.初始设置
+ D6 T( [6 e: B$ z" w9.起点 (1,1) 被标记为 -1(已遍历),并加入队列。- y) u$ f3 V% k7 E+ |6 m( `
10.广度优先搜索:
% X# H* A3 S; S. |+ a% ~2 `6 [11.使用一个 while 循环来进行搜索,直到队列为空。+ l: l& d3 R. }" P" C( T' B2 n
12.在每一轮中,取出队头的点 (sq.x(qh), sq.y(qh)),然后尝试向四个方向移动。
. X8 J5 |$ b$ d% [13.对于每个方向,如果新的坐标 (i, j) 是有效的(即在迷宫范围内且没有被遍历过),则将其标记为 -1(已遍历)并加入队列。0 v) O0 E# b# e% \
14.如果新的坐标是终点 (8,8),则从队列的尾部开始,回溯找到从终点到起点的路径。- H' m3 J7 b) j- S. I" l
15.回溯路径:
% T" T% _; Q+ L16.如果找到终点,那么从 qe 开始,通过 sq.pre 数组回溯每个点的前一个点,直到回到起点。+ r6 g6 x- X9 }: f q& O4 q
这样,当代码执行完成后,sq.x 和 sq.y 的值将表示从起点到终点的最短路径。
3 j: @' l$ h/ o# Z! ]" j6 {2 M: ~/ ?& e _
$ S4 ?3 p$ t+ r2 s |
zan
|