数学建模社区-数学中国
标题:
广度优先搜索 找到迷宫中的最短路径
[打印本页]
作者:
2744557306
时间:
2023-12-22 15:52
标题:
广度优先搜索 找到迷宫中的最短路径
clear all
" C+ f! Y3 L8 z' ]& O% C$ H! K+ {
clc
3 @% m% o+ d: u0 i# ]
maze=[0,0,0,0,0,0,0,0;
- S N+ I* J+ n3 x8 n0 U
0,1,1,1,1,0,1,0;
. h/ L: @! Q' n* r. C1 J
0,0,0,0,1,0,1,0;
/ a% [. a+ z3 t4 }
0,1,0,0,0,0,1,0;
* r$ R; g* Z( I; j5 A
0,1,0,1,1,0,1,0;
5 k( p( X$ f% G! o
0,1,0,0,0,0,1,1;
* z) A r2 ~1 L+ y9 p
0,1,0,0,1,0,0,0;
" O) g% h( p; ?. C; |( e" f
0,1,1,1,1,1,1,0];%迷宫:0为路,1为墙,-1为遍历过
2 |$ G# L# s" W5 _9 i: E, c( I( A! N
fx(1:4)=[1,-1,0,0];
: b Y9 w' n& T- W+ H
fy(1:4)=[0,0,-1,1];
( u9 L4 T; H2 k7 l
sq.pre=zeros(1,100);sq.x=zeros(1,100);sq.y=zeros(1,100);
5 P/ f$ |& e: `4 {. R: N
qh=0;%队头指针
( Q! Y2 P' b! Q
qe=1;%队尾指针
8 {! Y' N d7 j
maze(1,1)=-1;
, K+ ~% k: x5 k. h: y8 f% D) N: O. u
%第一个元素入队
) n6 s( K. W' P2 r( X
sq.pre(1)=0;sq.x(1)=1;sq.y(1)=1;
) t$ a7 x# d- K8 d
/ I0 k5 ]9 O: ^0 K) ?$ `
while qh-qe~=0
/ j; O9 I* |7 t& e! ]/ B
qh=qh+1;
+ p1 \4 J+ E" g6 c
bb=0;
# K! u+ o4 x& d1 y2 B0 \" b
for k=1:4
0 z1 _9 l" c9 _: W8 u8 K# u
i=sq.x(qh)+fx(k);
: g: W x. L1 @. c
j=sq.y(qh)+fy(k);
" `" ?: r2 A) V* P0 ]
if check(i,j,maze)==1
7 r3 Q1 R% W% u& y
qe=qe+1;%入队
. X" N) }/ ^. T* t
sq.x(qe)=i;sq.y(qe)=j;sq.pre(qe)=qh;
5 m7 \4 I$ S! W" B9 }5 O
maze(i,j)=-1;
8 ^7 G7 V0 Y: c/ k3 o( a- X1 X
5 _1 l, P( g* `
if i==8&j==8%如果为图最后一个点
1 [% B2 c* `, A! m
while qe~=0
+ o3 s& B( G* W' R) ~8 [ _
sq.x(qe)
. ~6 v" i) w8 N% U* {( a0 B
sq.y(qe)
% z8 S9 h# P& m- F# n
qe=sq.pre(qe);
5 z2 @$ S ?2 G# x
end
/ F5 e( F, F' l C4 H+ p
bb=1;
; y/ e9 e' j% p+ X( {: R
break;
3 W. ~ A1 ]0 [/ W+ S8 L
end %if
& I0 i) k" g( M+ r; @
end %if
N/ o( [( s4 k0 r( w5 T8 h, w
end
- l) M9 A3 V/ ^1 e$ [
if bb==1
% i% Q/ U* u p
break
1 L! O9 U8 [: t
end
0 j0 v" k# ]1 a: Y
end%while
9 \6 J( |% k, H; y6 _# L) w5 f5 D
0 p$ g5 D! @6 V: w$ u4 E
+ T0 }" ?" r1 V
这段代码实现了一个广度优先搜索(BFS)算法,用于找到迷宫中从起点 (1,1) 到终点 (8,8) 的最短路径。
% `9 w' T& @& K
以下是代码的详细解释:
2 o6 W' g% l$ @1 R( G9 K) W" R
' g" o# ]1 x- O
1.迷宫定义:
+ w/ I9 b% x+ s8 ^7 {
2.maze 是一个8x8的矩阵,其中 0 表示可通行的路径,1 表示墙,-1 表示已经遍历过的路径。
! C, B7 r5 H! o
3.方向定义:
6 _2 d8 O2 l% G) O
4.fx 和 fy 定义了四个方向,即上、下、左、右的偏移量。
6 A, K- E1 @& u( [+ D r2 f
5.队列定义:
: S9 |& o% \% }6 i
6.sq.pre, sq.x, sq.y 分别用于存储每个点的前一个点、x坐标和y坐标。
/ K/ k. j2 c& j5 e) B" k! p( `% Y. A
7.qh 和 qe 分别是队列的头和尾的指针。
/ a) ?* M* r0 |9 e d
8.初始设置
% H- a( Q& V. [; j8 r; _
9.起点 (1,1) 被标记为 -1(已遍历),并加入队列。
7 m. q" |5 N4 W5 k( b! O
10.广度优先搜索:
7 k* K7 z" E( M/ u* h# L" N
11.使用一个 while 循环来进行搜索,直到队列为空。
3 i/ ] ?: |: H y# [# S* w5 M0 |
12.在每一轮中,取出队头的点 (sq.x(qh), sq.y(qh)),然后尝试向四个方向移动。
v- }# @6 Z( S$ A9 \
13.对于每个方向,如果新的坐标 (i, j) 是有效的(即在迷宫范围内且没有被遍历过),则将其标记为 -1(已遍历)并加入队列。
s9 b1 {+ O ?. D3 Z. Q5 t1 z& @3 Q& X
14.如果新的坐标是终点 (8,8),则从队列的尾部开始,回溯找到从终点到起点的路径。
9 u8 e9 f4 A+ ~- ?$ v- z3 i/ m1 s* {) t
15.回溯路径:
$ \" Q3 _4 o. s! m a
16.如果找到终点,那么从 qe 开始,通过 sq.pre 数组回溯每个点的前一个点,直到回到起点。
( L, z1 ]5 \+ t* _& t2 @
这样,当代码执行完成后,sq.x 和 sq.y 的值将表示从起点到终点的最短路径。
1 s9 }+ y' D) B7 [, `6 N
& A8 c( Z1 Q: @) O) k0 t
$ F3 e) U7 ^7 Q# @; k% f
广度优先搜索.rar
2023-12-22 15:47 上传
点击文件名下载附件
下载积分: 体力 -2 点
736 Bytes, 下载次数: 0, 下载积分: 体力 -2 点
售价:
2 点体力
[
记录
] [
购买
]
欢迎光临 数学建模社区-数学中国 (http://www.madio.net/)
Powered by Discuz! X2.5