- 在线时间
- 480 小时
- 最后登录
- 2026-6-1
- 注册时间
- 2023-7-11
- 听众数
- 4
- 收听数
- 0
- 能力
- 0 分
- 体力
- 7823 点
- 威望
- 0 点
- 阅读权限
- 255
- 积分
- 2934
- 相册
- 0
- 日志
- 0
- 记录
- 0
- 帖子
- 1174
- 主题
- 1189
- 精华
- 0
- 分享
- 0
- 好友
- 1
该用户从未签到
 |
clear all
! `/ m* w& w& {: n! _clc
0 c0 P) C( Z. y7 `9 U8 L# u, wmaze=[0,0,0,0,0,0,0,0;( C5 C, P& Q. w" t g" \
0,1,1,1,1,0,1,0;6 p( s$ |1 `9 p
0,0,0,0,1,0,1,0;
1 e) c) b3 G1 X0 u 0,1,0,0,0,0,1,0;
* a/ G, ^' e7 m) o9 }! Y0 m: I* R 0,1,0,1,1,0,1,0;
$ f/ q7 c% t: r 0,1,0,0,0,0,1,1;! X* ]! A' Y( i% l$ I' d- \
0,1,0,0,1,0,0,0;' A& k& Y" r W6 E
0,1,1,1,1,1,1,0];%迷宫:0为路,1为墙,-1为遍历过
) U* d! Z" E3 `6 x* R4 jfx(1:4)=[1,-1,0,0];' |) y( X( o* _8 T; i# L% Q
fy(1:4)=[0,0,-1,1];
6 |, W c* V) M }' L' n( qsq.pre=zeros(1,100);sq.x=zeros(1,100);sq.y=zeros(1,100);/ s- g3 M3 E% G# }) \
qh=0;%队头指针
# h% W7 F. P# `/ v6 w% a4 d3 aqe=1;%队尾指针
- e) r8 m; h3 j4 K* Gmaze(1,1)=-1;' ^$ u5 Y& S$ ^' ]
%第一个元素入队
7 E' B1 F4 F! j( ]9 r3 [sq.pre(1)=0;sq.x(1)=1;sq.y(1)=1;8 w# Z* x% a1 y5 c: p) ~; Z& E) s: ?( f
6 c9 }8 R$ I9 J- D2 C. |
while qh-qe~=0( f9 D: n: a% f! z9 H5 Y2 r* R/ ^
qh=qh+1;: u) f, ^9 y' V! C
bb=0;' {0 I: L4 F* O5 ~( D
for k=1:4
9 v( ?2 Y9 d5 }2 _i=sq.x(qh)+fx(k);
5 O* O; v# x0 y! J( e+ ~: jj=sq.y(qh)+fy(k);+ }" X+ \: c0 f! W9 S; ^5 \' o# _
if check(i,j,maze)==17 ~; V; ^0 `/ l: c% q
qe=qe+1;%入队
7 p/ u' F7 W2 ^3 C/ b+ Nsq.x(qe)=i;sq.y(qe)=j;sq.pre(qe)=qh;
# X- d" E" ]: |8 Q/ x* amaze(i,j)=-1;
& B& p( v" g2 r2 A8 \
! _% c7 w. F* h0 Hif i==8&j==8%如果为图最后一个点
2 ~" V1 V1 R! @9 Nwhile qe~=0
' U$ _' c( q6 N$ `; Qsq.x(qe) ' k: A2 Y. Y, S1 Y2 l
sq.y(qe)
9 ]1 k+ j7 y4 `- iqe=sq.pre(qe);: z6 D8 t, b( i
end
5 }2 s+ R2 d% I9 T" b" F- U) xbb=1;3 i: ]. ^3 V1 C
break;
2 @' `; E9 r5 A) H# k) C: xend %if5 w' H( _, _# Y+ ?' h0 n
end %if
7 p" t( `1 p: u' A `& qend) ~5 S( T6 d {' c. S' |
if bb==1
- q1 U0 I ?; Ibreak: `4 I7 x3 @3 D5 s# M$ M2 w+ P
end) R- A2 Y3 H. A+ t1 W' e' s
end%while
, R& \7 H' n5 E6 R% U$ w2 e3 z
4 i( Q/ M/ A/ y
5 s! A- r1 @3 K9 L' Q( D, |0 A这段代码实现了一个广度优先搜索(BFS)算法,用于找到迷宫中从起点 (1,1) 到终点 (8,8) 的最短路径。
, Y6 d f3 z, l7 Y9 c! O/ n以下是代码的详细解释:
4 _) t+ ?% U p! ~7 o. D' v8 m0 z2 Z
1.迷宫定义:% P" O" ~4 I O9 c) y8 F0 ?
2.maze 是一个8x8的矩阵,其中 0 表示可通行的路径,1 表示墙,-1 表示已经遍历过的路径。- j" F' T: m }( g
3.方向定义:( {: t5 ?/ E4 `
4.fx 和 fy 定义了四个方向,即上、下、左、右的偏移量。* V( ~ @6 k1 o. ^2 o
5.队列定义:$ e% y5 H& J, k+ P/ C" u& H3 }: h
6.sq.pre, sq.x, sq.y 分别用于存储每个点的前一个点、x坐标和y坐标。
: C; Y m3 |) i4 @. o& q0 V7.qh 和 qe 分别是队列的头和尾的指针。# G; J! y5 M6 n
8.初始设置) {- D# S. n6 P& z
9.起点 (1,1) 被标记为 -1(已遍历),并加入队列。
* L1 {. j/ z9 H) Q( p& H10.广度优先搜索:) \. J( Z$ i5 F7 g
11.使用一个 while 循环来进行搜索,直到队列为空。& S% O |# A5 V3 o9 [, n
12.在每一轮中,取出队头的点 (sq.x(qh), sq.y(qh)),然后尝试向四个方向移动。
6 N" ` k/ z3 P13.对于每个方向,如果新的坐标 (i, j) 是有效的(即在迷宫范围内且没有被遍历过),则将其标记为 -1(已遍历)并加入队列。3 m _) A: M& _
14.如果新的坐标是终点 (8,8),则从队列的尾部开始,回溯找到从终点到起点的路径。; v& z7 M- W$ x& K c: b
15.回溯路径:
6 ]6 |/ x ]8 K5 F$ ?- ?' O+ @2 c, X16.如果找到终点,那么从 qe 开始,通过 sq.pre 数组回溯每个点的前一个点,直到回到起点。
# O+ k* ~0 b% ~% i* b p这样,当代码执行完成后,sq.x 和 sq.y 的值将表示从起点到终点的最短路径。: M( y2 d5 M# d1 r( A' |
0 M$ ~8 {! d3 W5 y8 c5 i/ Z L# `7 D# Z4 s$ o# N# H+ C- U
|
zan
|