数学建模社区-数学中国
标题:
广度优先搜索 找到迷宫中的最短路径
[打印本页]
作者:
2744557306
时间:
2023-12-22 15:52
标题:
广度优先搜索 找到迷宫中的最短路径
clear all
. z* @7 A5 G* m! E% i$ Q. l5 I
clc
& E# N4 G3 |* P9 ?$ J0 ?8 H
maze=[0,0,0,0,0,0,0,0;
2 o' G2 n2 o K4 R* |1 S- b
0,1,1,1,1,0,1,0;
- M. O. t2 \3 |; e
0,0,0,0,1,0,1,0;
6 Y4 S8 L4 N% }
0,1,0,0,0,0,1,0;
3 R5 H& @' H. z
0,1,0,1,1,0,1,0;
, a2 u0 ?# u- F/ [0 Q8 `+ ]
0,1,0,0,0,0,1,1;
2 \& O9 j" {& D- O+ T; i4 d `5 V. k5 o0 H
0,1,0,0,1,0,0,0;
% Q6 x, N5 q# ~7 z4 [
0,1,1,1,1,1,1,0];%迷宫:0为路,1为墙,-1为遍历过
1 c$ S7 j" ?# o; q* f, i
fx(1:4)=[1,-1,0,0];
" j0 @ E# u. |, d# z
fy(1:4)=[0,0,-1,1];
@1 f3 y, _: I+ j8 h) _7 N
sq.pre=zeros(1,100);sq.x=zeros(1,100);sq.y=zeros(1,100);
! j1 X, J5 M4 y0 P6 @. k
qh=0;%队头指针
1 b# H- G* y! @
qe=1;%队尾指针
' Z$ {( f( W% L \
maze(1,1)=-1;
# x1 E) ^- j3 ?& e
%第一个元素入队
5 i& D _$ w [' N+ L) }8 q0 `
sq.pre(1)=0;sq.x(1)=1;sq.y(1)=1;
3 q! l# { H, Q1 n1 K
- y8 M$ P3 A; H9 ~
while qh-qe~=0
' K: x' r$ z; n, Q
qh=qh+1;
s, K I7 q7 Q7 C m: |
bb=0;
3 d, q4 F9 P* c0 j5 ?& h
for k=1:4
% u' T% g" `3 m$ _7 O% Q: l
i=sq.x(qh)+fx(k);
1 f8 ~2 _2 s' u# r0 p/ J
j=sq.y(qh)+fy(k);
% \7 a0 V _9 g }9 {
if check(i,j,maze)==1
* P9 A% C2 `1 S; X+ Z9 n8 G
qe=qe+1;%入队
( K+ @# a# d& T8 |: K' z
sq.x(qe)=i;sq.y(qe)=j;sq.pre(qe)=qh;
( `8 X5 g; {* k3 I% R% o, @% M
maze(i,j)=-1;
1 g/ S4 V. i I3 N. i
$ ~7 ~: H; t' D& _' V
if i==8&j==8%如果为图最后一个点
( s3 ^6 H' g3 N5 X6 }
while qe~=0
4 j, n, s$ r# c6 U* e- \
sq.x(qe)
4 Z2 @, v6 m: X7 @0 F
sq.y(qe)
7 f% L n+ e; ~& e
qe=sq.pre(qe);
4 g$ V2 \4 b- u( v* v) i2 ^: m: w
end
6 P. E9 C* O* Q8 j1 r% @5 D7 d
bb=1;
1 {& m$ u: ]1 _) C
break;
. K; K7 W2 T; `& u$ s' H: T
end %if
$ i5 F7 M' c9 b6 z: C- `
end %if
7 A2 ^& u& i4 w5 f
end
/ Q. I2 S1 C G; f( ?( L
if bb==1
+ L; Q; L1 j$ n. P# A7 N7 ^3 b
break
1 A+ B+ `, o7 o1 b) W1 U# f
end
& d& m9 p- t) @: ^& Y3 H) x
end%while
0 N# F7 X! }+ r7 j
. Q4 |" _4 T A
1 \" t# R. c; {) I' h: d- o# \8 }
这段代码实现了一个广度优先搜索(BFS)算法,用于找到迷宫中从起点 (1,1) 到终点 (8,8) 的最短路径。
W) C, V% P; k, P. _& e% W1 c
以下是代码的详细解释:
# L' |3 N k& ~, v, o+ h
2 [8 [& h0 x* ?" Q2 R/ ?
1.迷宫定义:
% {3 Z8 f& a4 b. E3 d
2.maze 是一个8x8的矩阵,其中 0 表示可通行的路径,1 表示墙,-1 表示已经遍历过的路径。
0 m& i+ c" ?4 i$ Y! t% J1 G' B
3.方向定义:
5 j. k0 f) {- E6 C6 g5 M$ n
4.fx 和 fy 定义了四个方向,即上、下、左、右的偏移量。
1 b3 j& @3 E' W, `/ T* v& n
5.队列定义:
9 h% {; d+ f( f7 C D+ _2 L3 L
6.sq.pre, sq.x, sq.y 分别用于存储每个点的前一个点、x坐标和y坐标。
$ b2 ?8 w3 K7 f. `; u
7.qh 和 qe 分别是队列的头和尾的指针。
5 r5 N \, Q, m2 h3 b# R; f4 y" V
8.初始设置
* j$ f* ?1 L5 g* V. F8 ^! A
9.起点 (1,1) 被标记为 -1(已遍历),并加入队列。
0 J" M4 @. ~4 e
10.广度优先搜索:
2 N* B5 A8 B' e
11.使用一个 while 循环来进行搜索,直到队列为空。
+ a+ j- B+ _) F2 D* V$ @
12.在每一轮中,取出队头的点 (sq.x(qh), sq.y(qh)),然后尝试向四个方向移动。
) O) m% T, q7 K8 E1 D
13.对于每个方向,如果新的坐标 (i, j) 是有效的(即在迷宫范围内且没有被遍历过),则将其标记为 -1(已遍历)并加入队列。
' G; p: `6 R2 N1 T* e
14.如果新的坐标是终点 (8,8),则从队列的尾部开始,回溯找到从终点到起点的路径。
4 c) D O- t& g/ A
15.回溯路径:
7 n' g6 V" r' ]+ Z2 G* T
16.如果找到终点,那么从 qe 开始,通过 sq.pre 数组回溯每个点的前一个点,直到回到起点。
2 @6 D, [8 z0 {: a
这样,当代码执行完成后,sq.x 和 sq.y 的值将表示从起点到终点的最短路径。
7 k; k# K! i6 Z& M9 ^
; W: T( X a) n ]2 U6 j1 v
% J7 }6 x! B8 V4 s" p- G9 k, S
广度优先搜索.rar
2023-12-22 15:47 上传
点击文件名下载附件
下载积分: 体力 -2 点
736 Bytes, 下载次数: 0, 下载积分: 体力 -2 点
售价:
2 点体力
[
记录
] [
购买
]
欢迎光临 数学建模社区-数学中国 (http://www.madio.net/)
Powered by Discuz! X2.5