QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 2121|回复: 0
打印 上一主题 下一主题

广度优先搜索 找到迷宫中的最短路径

[复制链接]
字体大小: 正常 放大

1189

主题

4

听众

2934

积分

该用户从未签到

跳转到指定楼层
1#
发表于 2023-12-22 15:52 |只看该作者 |正序浏览
|招呼Ta 关注Ta
clear all4 ]  |( W/ G" e, g
clc5 A0 d" f; N6 ^/ p; _0 X
maze=[0,0,0,0,0,0,0,0;9 ^. F7 F% r$ w" v7 a6 l
      0,1,1,1,1,0,1,0;# p, W$ P0 ]5 a
      0,0,0,0,1,0,1,0;
0 `0 ?: o4 ]4 W: w4 x4 H" D      0,1,0,0,0,0,1,0;
, w1 t9 F2 b9 n  ]      0,1,0,1,1,0,1,0;
" I9 Z" ^! D# c6 h, d6 Z/ d      0,1,0,0,0,0,1,1;% M; U% |* ?8 K6 s$ n
      0,1,0,0,1,0,0,0;" [7 c/ p% n; H4 D/ K- V
      0,1,1,1,1,1,1,0];%迷宫:0为路,1为墙,-1为遍历过
9 M8 F" A) W: I, e8 N3 Z( U9 Cfx(1:4)=[1,-1,0,0];
) q+ V) Q' B# j% r$ Dfy(1:4)=[0,0,-1,1];
% E5 a/ d4 W8 ^9 g& l7 r4 qsq.pre=zeros(1,100);sq.x=zeros(1,100);sq.y=zeros(1,100);
/ p% o3 ?$ g# P# Z* x) i$ _qh=0;%队头指针
8 k: f5 _0 m( N/ Z, l( ?# P/ _- _qe=1;%队尾指针
5 `# L# F1 t; |6 _# P! K2 }0 R1 dmaze(1,1)=-1;
+ N# g, \9 X. H+ C+ r4 U%第一个元素入队
7 y. u( d  y4 O! C3 }- g# Xsq.pre(1)=0;sq.x(1)=1;sq.y(1)=1;
. d( i1 W; b% \; r0 M3 B4 q! P; R: w4 o0 K! S
while qh-qe~=0) f) [5 Y& `" M% N6 y
qh=qh+1;( W: L8 d% ?0 A" |9 a1 M
bb=0;& m- B: V; Y' X( m- s) N. Q5 `
for k=1:40 }& ?, y3 }  X7 y, P
i=sq.x(qh)+fx(k);: \: r) v0 G9 \
j=sq.y(qh)+fy(k);
/ [/ V$ R3 s9 d0 Tif check(i,j,maze)==1( M* W1 Z) X1 y5 v/ j) e( A' T$ a
qe=qe+1;%入队
6 X+ }9 H2 }  D5 l6 asq.x(qe)=i;sq.y(qe)=j;sq.pre(qe)=qh;, z, |+ U& p* D- o' c, x
maze(i,j)=-1;
5 \: v) X8 b2 P9 s4 W- @
" `2 V0 f; [+ r0 a  @if i==8&j==8%如果为图最后一个点
" o3 z# y7 {, r: ]2 t/ |* l) f9 Zwhile qe~=0/ w$ `$ o! P$ h) J. c
sq.x(qe)
) q* q* S6 o  o, F" vsq.y(qe)   
$ D3 `. `/ F4 d4 Q9 G% u( xqe=sq.pre(qe);3 W; T) }+ `  F; L9 W' a
end
1 M* W: Z2 }- U7 z/ Z' f' Mbb=1;3 q5 Z4 }/ Y  ]/ W) z
break;' z( j* ]* ?& y4 @% C+ B( m8 F3 r
end %if* }, W5 `2 _; a
end %if( k  I; t$ P" f; |
end
0 s+ h: e$ D0 h& [3 r. T6 lif bb==1
) f, l& C" X/ y4 rbreak
# B! c' D9 {4 y5 Z! I/ M+ J- b7 _* qend% g3 a& }7 J! O6 ~
end%while4 f1 @* _0 O) K& w

3 L) n- y7 X$ k# B$ K3 W, ~* N$ V* W5 _  ~, P) {
这段代码实现了一个广度优先搜索(BFS)算法,用于找到迷宫中从起点 (1,1) 到终点 (8,8) 的最短路径。( _' {# R2 `- u: @% C, k
以下是代码的详细解释:
+ n4 i- F' W# }; p5 }1 b+ n8 q5 |1 z4 d
1.迷宫定义:2 v1 @  a9 m$ U
2.maze 是一个8x8的矩阵,其中 0 表示可通行的路径,1 表示墙,-1 表示已经遍历过的路径。
7 ^" N9 O* b/ l0 l4 O' a; ~3 T3.方向定义:
, q  b: Q* O& G% g. Y! c& d7 C4.fx 和 fy 定义了四个方向,即上、下、左、右的偏移量。
. X# a" H& {% @; E8 {: p+ k9 a: g5.队列定义:' {3 o6 K2 X4 `' b: L! G3 h
6.sq.pre, sq.x, sq.y 分别用于存储每个点的前一个点、x坐标和y坐标。6 j( F3 g- q4 }( M3 [( ?0 ^, z
7.qh 和 qe 分别是队列的头和尾的指针。
8 |. L3 A- F7 Z8.初始设置
' f% h6 w5 B( p, I, p& N9 |9.起点 (1,1) 被标记为 -1(已遍历),并加入队列。
. B  Y" w/ `8 L) U10.广度优先搜索:& ?) I% u( q5 k2 n# i0 }
11.使用一个 while 循环来进行搜索,直到队列为空。
2 `/ M6 l8 `6 A12.在每一轮中,取出队头的点 (sq.x(qh), sq.y(qh)),然后尝试向四个方向移动。9 G& z2 E9 z) d
13.对于每个方向,如果新的坐标 (i, j) 是有效的(即在迷宫范围内且没有被遍历过),则将其标记为 -1(已遍历)并加入队列。
9 a8 Y/ U$ ^& @) b$ l5 A5 G14.如果新的坐标是终点 (8,8),则从队列的尾部开始,回溯找到从终点到起点的路径。7 B6 B$ ~) f# R* R/ O3 |
15.回溯路径:
6 x: K' U2 m: E2 u; W" [) j16.如果找到终点,那么从 qe 开始,通过 sq.pre 数组回溯每个点的前一个点,直到回到起点。8 U( _$ J9 y0 K/ b+ K2 `1 c& q! u
这样,当代码执行完成后,sq.x 和 sq.y 的值将表示从起点到终点的最短路径。
4 P: ?% A6 T7 ^% S
) V: c4 |3 \& A, \$ w4 _) p' D" W2 J) l% n4 v

广度优先搜索.rar

736 Bytes, 下载次数: 0, 下载积分: 体力 -2 点

售价: 2 点体力  [记录]  [购买]

zan
转播转播0 分享淘帖0 分享分享0 收藏收藏0 支持支持0 反对反对0 微信微信
您需要登录后才可以回帖 登录 | 注册地址

qq
收缩
  • 电话咨询

  • 04714969085
fastpost

关于我们| 联系我们| 诚征英才| 对外合作| 产品服务| QQ

手机版|Archiver| |繁體中文 手机客户端  

蒙公网安备 15010502000194号

Powered by Discuz! X2.5   © 2001-2013 数学建模网-数学中国 ( 蒙ICP备14002410号-3 蒙BBS备-0002号 )     论坛法律顾问:王兆丰

GMT+8, 2026-8-1 00:15 , Processed in 0.419535 second(s), 55 queries .

回顶部