- 在线时间
- 480 小时
- 最后登录
- 2026-6-1
- 注册时间
- 2023-7-11
- 听众数
- 4
- 收听数
- 0
- 能力
- 0 分
- 体力
- 7823 点
- 威望
- 0 点
- 阅读权限
- 255
- 积分
- 2934
- 相册
- 0
- 日志
- 0
- 记录
- 0
- 帖子
- 1174
- 主题
- 1189
- 精华
- 0
- 分享
- 0
- 好友
- 1
该用户从未签到
 |
clear all
' R. a' ^; X+ N& `clc2 d7 T0 \0 K* o" X7 X# q! k7 V
maze=[0,0,0,0,0,0,0,0;
0 V- N; D6 i8 y e7 ]2 S: a( l# k$ r) u 0,1,1,1,1,0,1,0;' {$ Z% u. @3 o3 P& S' s. A
0,0,0,0,1,0,1,0;
( Y4 a# ]% A7 M3 f 0,1,0,0,0,0,1,0;
2 f' ^7 E5 i8 T4 W3 b% \$ ^ 0,1,0,1,1,0,1,0;
1 P- Z( I. @* A# J 0,1,0,0,0,0,1,1;
) O7 c9 E2 l% c% Y( F9 u 0,1,0,0,1,0,0,0;
+ U+ U& p9 e6 [+ V7 N! I 0,1,1,1,1,1,1,0];%迷宫:0为路,1为墙,-1为遍历过* Q7 G' J9 r @0 h0 b
fx(1:4)=[1,-1,0,0];
5 K/ m2 C1 K$ O U7 n6 ufy(1:4)=[0,0,-1,1];
7 |/ f- T; I9 W6 Ysq.pre=zeros(1,100);sq.x=zeros(1,100);sq.y=zeros(1,100);
! v# w" l) l3 L6 t/ _qh=0;%队头指针
- R; A+ d+ }8 e/ ^* W) X; e% uqe=1;%队尾指针; x, K, t7 W* C7 {2 p. @5 o2 u z
maze(1,1)=-1;$ E) B q; _5 p$ {( J( r# r
%第一个元素入队9 A7 H5 {; [0 Q
sq.pre(1)=0;sq.x(1)=1;sq.y(1)=1;
& p. Z: |8 X' k: U1 b2 y. q9 Q2 W! I! L
while qh-qe~=0
8 m" o! `6 }* e* v' a9 X3 fqh=qh+1;# _1 C) w% N6 R0 v8 ^4 E
bb=0;/ p; b/ Q" |( S4 g" r
for k=1:4
) V; C. ] Q. Q0 V* y" y0 `i=sq.x(qh)+fx(k);
! F: ? c" Y) w* o5 a' ~j=sq.y(qh)+fy(k);) ]1 q/ Q- I2 a( X! Y
if check(i,j,maze)==1
/ I0 o. d1 H% q2 ^+ t& @qe=qe+1;%入队
& i% b' W9 ^/ \0 Gsq.x(qe)=i;sq.y(qe)=j;sq.pre(qe)=qh;
. u# I6 U# i7 S8 d; Y( b" Bmaze(i,j)=-1;
! R; @- |! X* {) O# V
# M- |/ m+ B7 T B' n% Gif i==8&j==8%如果为图最后一个点
% m6 o! t8 E' H4 ?1 {/ ^while qe~=0
5 \% R6 w8 A8 d; c4 Ssq.x(qe)
& d+ r8 i( U6 Gsq.y(qe) 4 I6 B0 E9 z$ R4 k. \" ?5 A7 `: I0 ~
qe=sq.pre(qe);
0 U8 p0 y- W; h, _ l- x4 @0 ~7 i( E$ rend ! k# K" [( |; R0 T% W' F; c
bb=1;
3 \6 U# M; H q5 k" }2 Rbreak;
' i6 l; X3 \" o' @$ y' Z( h0 Pend %if/ m; Z* B+ m4 G
end %if. l: M+ i- P* q$ X' Z& Y
end' x7 k' I* X. v7 P# C$ f+ W4 w
if bb==1" S4 N* ~! w0 G7 p& u# y4 S
break# L; p( q* H0 z+ Y
end& \1 y5 Q/ ]- s' \4 c; z
end%while
* i' l, {% ^" o$ ~
5 o `6 i2 n- C' {6 ]5 m
5 u& H2 k8 A8 k/ G. N这段代码实现了一个广度优先搜索(BFS)算法,用于找到迷宫中从起点 (1,1) 到终点 (8,8) 的最短路径。
' x# V* n& Z3 n. H1 w' j以下是代码的详细解释:
+ O& v( i. k1 [2 J' z3 K/ s/ L# S8 w7 ]
1.迷宫定义:' _$ d W" A( T$ H" |( ?
2.maze 是一个8x8的矩阵,其中 0 表示可通行的路径,1 表示墙,-1 表示已经遍历过的路径。
6 \8 U% a0 `+ ? `& L- g3 x) h N3.方向定义:* O- z7 V9 N8 U; O: a
4.fx 和 fy 定义了四个方向,即上、下、左、右的偏移量。. j3 o% \+ R1 N
5.队列定义:6 Z% S2 C# ]$ k# q% a
6.sq.pre, sq.x, sq.y 分别用于存储每个点的前一个点、x坐标和y坐标。" |* _! \+ i1 X9 Q Y
7.qh 和 qe 分别是队列的头和尾的指针。, n% G8 P6 g% F2 I8 Y. c1 j% j
8.初始设置
6 b: o+ q& i; O* T9.起点 (1,1) 被标记为 -1(已遍历),并加入队列。. T. b) O {" v* V( ~
10.广度优先搜索:
+ u& w8 ~% Q) [11.使用一个 while 循环来进行搜索,直到队列为空。1 x) S; M8 i, Y, E
12.在每一轮中,取出队头的点 (sq.x(qh), sq.y(qh)),然后尝试向四个方向移动。 l" r3 z6 j" n" p5 }8 \; ^- ^, y
13.对于每个方向,如果新的坐标 (i, j) 是有效的(即在迷宫范围内且没有被遍历过),则将其标记为 -1(已遍历)并加入队列。
$ ~9 T2 Y/ _4 ]1 R6 n# P14.如果新的坐标是终点 (8,8),则从队列的尾部开始,回溯找到从终点到起点的路径。9 q. e- h. t/ d4 j# @$ E! w
15.回溯路径:
* S, W6 J- z& M" N. i$ y16.如果找到终点,那么从 qe 开始,通过 sq.pre 数组回溯每个点的前一个点,直到回到起点。0 `7 ] ?0 K8 y5 ?5 K
这样,当代码执行完成后,sq.x 和 sq.y 的值将表示从起点到终点的最短路径。
$ Q6 B1 y: q A e: N9 Z o+ t) ?0 b. i
6 u) W* u. \5 A+ i |
zan
|