- 在线时间
- 472 小时
- 最后登录
- 2025-9-5
- 注册时间
- 2023-7-11
- 听众数
- 4
- 收听数
- 0
- 能力
- 0 分
- 体力
- 7679 点
- 威望
- 0 点
- 阅读权限
- 255
- 积分
- 2884
- 相册
- 0
- 日志
- 0
- 记录
- 0
- 帖子
- 1161
- 主题
- 1176
- 精华
- 0
- 分享
- 0
- 好友
- 1
该用户从未签到
 |
clear all+ ^9 i2 a$ x& P1 X- X+ Z4 D
clc
( |! K" m3 c8 Z2 tmaze=[0,0,0,0,0,0,0,0;
( W K6 ]- N" X) A" w2 B6 Y( C1 I8 h 0,1,1,1,1,0,1,0;
2 S# P T; @4 v n7 f" j 0,0,0,0,1,0,1,0;& E! s5 W, c% o4 R1 p
0,1,0,0,0,0,1,0;& {9 ~7 b0 C2 @' N/ J
0,1,0,1,1,0,1,0;8 ]+ G# ]. C' h9 L5 i. O4 u5 c
0,1,0,0,0,0,1,1;9 G' B* W) X" A; A* w P' y: e
0,1,0,0,1,0,0,0;1 w- \; {, \6 o" O. ~0 b" s
0,1,1,1,1,1,1,0];%迷宫:0为路,1为墙,-1为遍历过7 `; }, e8 a. y0 s2 j3 u
fx(1:4)=[1,-1,0,0];+ r2 ^2 V" _) Y5 B' z
fy(1:4)=[0,0,-1,1];
7 l; {# e7 J$ U% x/ h3 m" s6 usq.pre=zeros(1,100);sq.x=zeros(1,100);sq.y=zeros(1,100);$ `$ b: P( Y; i, }6 [! _
qh=0;%队头指针
& ]1 ~( L# F3 m+ Zqe=1;%队尾指针
+ a/ e* b' |4 G3 v8 I+ Zmaze(1,1)=-1;
( R2 T7 b3 U6 c5 e0 ^( O: p% G; N%第一个元素入队/ H( l9 o) t+ W( |3 ?! J5 P
sq.pre(1)=0;sq.x(1)=1;sq.y(1)=1; G5 z; Y0 L3 a. S+ i9 X
& O( p3 o. c; ]2 H) c! cwhile qh-qe~=0
; [! k/ R! ]% O6 D9 T5 d. gqh=qh+1;
6 h8 `4 H1 V0 F/ }0 Lbb=0;
G) L! M# g2 a- X! W8 W jfor k=1:4
4 N. Q# _, x2 w1 i, }: k5 x0 P7 ai=sq.x(qh)+fx(k);' k4 W* U% c0 V- E0 p; }0 {
j=sq.y(qh)+fy(k);" k+ E# H' j) j, M$ M
if check(i,j,maze)==10 e9 L" @/ A+ O+ |0 q9 ^( a
qe=qe+1;%入队
+ Q" o+ O5 }0 y1 }1 U5 a5 \sq.x(qe)=i;sq.y(qe)=j;sq.pre(qe)=qh;
' }. S0 b( ]5 G- m( X) ymaze(i,j)=-1;
( r) B6 q4 x+ K9 l- F- w* t* ~. r2 H! ]4 g8 n1 E: _. h# S6 B
if i==8&j==8%如果为图最后一个点
4 C) q( y, Q) G4 W2 Lwhile qe~=0. c! B4 k1 ?& T- N0 d! G# K/ c& T
sq.x(qe) , [( o2 k' T. d
sq.y(qe)
6 Y/ J0 o& [. A. P9 U+ [' @( r# nqe=sq.pre(qe);
. T8 {! i) E, t4 ^7 ^6 K9 W: Xend - {6 `1 R# ?! ]* O8 a: o' z
bb=1;4 e( W* {( ?8 J7 @- D$ |) P
break;. k5 W' b8 U' a+ D7 A" q6 @( V
end %if
D( M0 V/ L( Lend %if4 S. Y2 d+ Q P0 @" u
end, R2 ]5 N) d2 A, k/ B3 b; y5 y
if bb==18 {! u4 f: ~4 |) _6 h9 X5 r
break
# y L, T, [; { t6 b$ Gend
# z# b/ i9 w( D' X3 Cend%while5 t5 ]9 J* B: A/ M' U; ]) b5 C, |
! h2 Y# s; S2 F* g# L
* N" K" |& @# B0 r这段代码实现了一个广度优先搜索(BFS)算法,用于找到迷宫中从起点 (1,1) 到终点 (8,8) 的最短路径。6 \( }( @9 x1 y7 t
以下是代码的详细解释:
" O) f+ }8 e) l% G& l, Y0 s; P- f/ ~* r( D& U, I' j
1.迷宫定义:! L) B- J1 W2 @8 }. N
2.maze 是一个8x8的矩阵,其中 0 表示可通行的路径,1 表示墙,-1 表示已经遍历过的路径。( @- }# m9 Z- h$ A1 N! Z) y
3.方向定义:
; D; @5 v9 }1 s j2 e( U4.fx 和 fy 定义了四个方向,即上、下、左、右的偏移量。
* X' _3 E) N' ?) R+ h" H4 G5.队列定义:4 g, ]8 b2 x/ U* R9 ~- P
6.sq.pre, sq.x, sq.y 分别用于存储每个点的前一个点、x坐标和y坐标。
o4 o7 Y3 Q. i% i9 U+ c- E s7.qh 和 qe 分别是队列的头和尾的指针。
8 T0 U3 _- _: |; a8.初始设置
9 r1 Z* `2 x* [; j6 l9.起点 (1,1) 被标记为 -1(已遍历),并加入队列。
3 k9 [$ T9 |* v. K: r5 X10.广度优先搜索:
5 H2 d+ W; n6 z8 O N& `" k. U" n11.使用一个 while 循环来进行搜索,直到队列为空。, T- |7 ~* Z3 j% d. d* m7 u
12.在每一轮中,取出队头的点 (sq.x(qh), sq.y(qh)),然后尝试向四个方向移动。
) d t Q. E o; @13.对于每个方向,如果新的坐标 (i, j) 是有效的(即在迷宫范围内且没有被遍历过),则将其标记为 -1(已遍历)并加入队列。+ |% Y# @+ h3 Q7 r6 h+ a' d
14.如果新的坐标是终点 (8,8),则从队列的尾部开始,回溯找到从终点到起点的路径。
# J* \; i8 \3 G% S15.回溯路径:$ G6 A9 V) F( }8 ^3 i# ~
16.如果找到终点,那么从 qe 开始,通过 sq.pre 数组回溯每个点的前一个点,直到回到起点。
( }! ?8 D0 V3 i这样,当代码执行完成后,sq.x 和 sq.y 的值将表示从起点到终点的最短路径。7 s5 T2 B3 X; n/ G
/ K4 y. }! {# d* [) F5 M- G
/ F' m; N# U5 J% w: n1 ~# F |
zan
|