- 在线时间
- 478 小时
- 最后登录
- 2026-4-9
- 注册时间
- 2023-7-11
- 听众数
- 4
- 收听数
- 0
- 能力
- 0 分
- 体力
- 7788 点
- 威望
- 0 点
- 阅读权限
- 255
- 积分
- 2922
- 相册
- 0
- 日志
- 0
- 记录
- 0
- 帖子
- 1171
- 主题
- 1186
- 精华
- 0
- 分享
- 0
- 好友
- 1
该用户从未签到
 |
clear all- `9 v: [/ J" I) v- j W
clc
6 o+ O k: c1 [9 k4 K# `maze=[0,0,0,0,0,0,0,0;8 r+ q( j4 d; k- a' X
0,1,1,1,1,0,1,0;1 v$ G+ y j: i% M
0,0,0,0,1,0,1,0;2 S0 Q% V5 t! r7 n
0,1,0,0,0,0,1,0;
$ C" f7 G& O8 p* B1 g) G& S3 h) B 0,1,0,1,1,0,1,0;; c- ^* e- n. R$ g0 F; W1 a
0,1,0,0,0,0,1,1;! `% K( N8 o# n, e) ]# g
0,1,0,0,1,0,0,0;
1 H. J# h9 s9 J$ M" t9 o+ Q! k 0,1,1,1,1,1,1,0];%迷宫:0为路,1为墙,-1为遍历过
3 L& R5 i. G I, N6 c4 w' q1 ^fx(1:4)=[1,-1,0,0];9 E( J8 o, z. q
fy(1:4)=[0,0,-1,1];4 Z/ E2 B8 _; H" T N ` G# t
sq.pre=zeros(1,100);sq.x=zeros(1,100);sq.y=zeros(1,100);" y' b U1 m p* T) q. A/ d
qh=0;%队头指针
0 B# ? H9 N* l% vqe=1;%队尾指针% h7 [" ^9 n5 }/ j9 W2 N
maze(1,1)=-1;. T" H- }! Y5 n
%第一个元素入队
! B/ }7 E3 B" M3 j; s* Y( xsq.pre(1)=0;sq.x(1)=1;sq.y(1)=1;0 S3 j2 T' o7 y {$ |+ f
& D D; `, K8 ?/ H1 N5 v0 h' Z4 Ywhile qh-qe~=0
/ ]6 N' ^2 W* I; D% C" X* {qh=qh+1;) e5 i1 Y7 r8 c% e. D
bb=0;
+ @- Z( v k" p+ ]- K( ~) m% _- ifor k=1:4, y& U5 F+ g' A9 j
i=sq.x(qh)+fx(k);
- C% S- M5 ^7 [j=sq.y(qh)+fy(k);/ S/ z# `0 W) `. h) J+ o! l% K a
if check(i,j,maze)==10 o: K, B8 b5 ^8 R+ x* ?, V
qe=qe+1;%入队
+ ~4 t0 J6 C( M% Gsq.x(qe)=i;sq.y(qe)=j;sq.pre(qe)=qh;! s6 N4 a' s' q( {. q' I6 F
maze(i,j)=-1;
9 ~3 H2 t9 y/ c9 `. x z- d$ U [
: V) A+ z* \8 i, @0 s0 A7 Yif i==8&j==8%如果为图最后一个点
6 m j* r5 X1 N, wwhile qe~=0
$ D9 O7 | n! w7 j+ Msq.x(qe) ' \6 }4 L* [' W( W# J& W
sq.y(qe)
4 _! b+ r/ f! f( H W. j: eqe=sq.pre(qe);$ C6 \. m5 H0 _3 e% S+ s
end ) i. Y/ d' W8 [ u) i) i* g. f3 k
bb=1;1 }& T& p$ l; n) V
break;7 Z0 ~6 C. ^" k/ [8 o1 ?4 Z5 Q
end %if
% ?! O& r) K7 j+ O* N$ r+ N a: `( mend %if
5 C- `0 Y" f% _9 vend/ L2 h2 P8 ^9 V/ ?. ]
if bb==1/ l2 q( w6 w2 c' W5 k' O& j) c3 w
break
3 r/ {6 W9 D }9 x# m& Nend
# s. J7 F# s1 g; Cend%while5 k" F3 V1 g9 m9 B' Y2 v
' k$ n D& @( w, Y5 \5 ?7 C5 |
+ [3 V7 z2 f/ n/ Q$ R, B这段代码实现了一个广度优先搜索(BFS)算法,用于找到迷宫中从起点 (1,1) 到终点 (8,8) 的最短路径。
$ G& p. N$ j4 h4 r/ S以下是代码的详细解释:7 F, _8 i: q3 j$ T3 G% t. M; a
2 a; J" Q' f6 k" {9 U9 m: T* e1.迷宫定义:
1 A9 d$ H& K9 ^1 i! S& S& C) j2.maze 是一个8x8的矩阵,其中 0 表示可通行的路径,1 表示墙,-1 表示已经遍历过的路径。
% J1 p: F0 B- ^$ U' h N% l: n! d9 [2 H3.方向定义:
! o; F1 e' b. l4.fx 和 fy 定义了四个方向,即上、下、左、右的偏移量。
) z6 q3 `1 ^0 Z3 A/ V3 F5.队列定义:
* t# G1 w, w) E" e6.sq.pre, sq.x, sq.y 分别用于存储每个点的前一个点、x坐标和y坐标。
, ~# R- F* u* K; f% Q0 O% L7.qh 和 qe 分别是队列的头和尾的指针。( l0 U' W: J( i$ Y5 S" Z1 `% s0 g
8.初始设置1 G" y. s9 S) h5 g! H
9.起点 (1,1) 被标记为 -1(已遍历),并加入队列。
* _1 j) f4 h9 t u8 M0 \0 p: c/ a- c# l10.广度优先搜索:
$ h& w; P: n7 e11.使用一个 while 循环来进行搜索,直到队列为空。
8 E5 x& U2 Y) O- l12.在每一轮中,取出队头的点 (sq.x(qh), sq.y(qh)),然后尝试向四个方向移动。* Q g+ X4 R. n) F
13.对于每个方向,如果新的坐标 (i, j) 是有效的(即在迷宫范围内且没有被遍历过),则将其标记为 -1(已遍历)并加入队列。: f( p' k f9 T, Z# H
14.如果新的坐标是终点 (8,8),则从队列的尾部开始,回溯找到从终点到起点的路径。5 y4 r/ [# K0 X/ P
15.回溯路径:, M) j! ~9 w9 k, g! k- R( }
16.如果找到终点,那么从 qe 开始,通过 sq.pre 数组回溯每个点的前一个点,直到回到起点。+ _4 Q6 L/ d, [. t* N% w& e* z5 ?- {
这样,当代码执行完成后,sq.x 和 sq.y 的值将表示从起点到终点的最短路径。& I% t# P P K, u9 @" d
2 }9 S, L! _2 E) g' _/ U, n' Y
5 N( U$ V5 [) b' V9 S9 S% ?! {! B. X |
zan
|