QQ登录

只需要一步,快速开始

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

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

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

1189

主题

4

听众

2934

积分

该用户从未签到

跳转到指定楼层
1#
发表于 2023-12-22 15:52 |只看该作者 |倒序浏览
|招呼Ta 关注Ta
clear all
# ?0 Q2 O! a8 g  Q1 J# E" Nclc! p- S3 m' d' c3 j4 p( x
maze=[0,0,0,0,0,0,0,0;7 e" y6 }5 `* c2 a1 f
      0,1,1,1,1,0,1,0;
  `/ M% E5 x1 P. W" _3 T, W      0,0,0,0,1,0,1,0;* v' a) W7 Y1 }& \
      0,1,0,0,0,0,1,0;( Y% B, \  ~( @' u& _
      0,1,0,1,1,0,1,0;
5 K' E6 k/ @' @  }0 W# v+ T      0,1,0,0,0,0,1,1;
7 l; j& a( X% }* O& ^  z: ~# y' t, \      0,1,0,0,1,0,0,0;
4 R1 x. T+ C/ c% G      0,1,1,1,1,1,1,0];%迷宫:0为路,1为墙,-1为遍历过# \, ?, G* r& n
fx(1:4)=[1,-1,0,0];  ^7 _' z4 f" ^/ j3 a) ]
fy(1:4)=[0,0,-1,1];0 v, ~6 N; z1 \( H1 i& N: c+ h5 G$ _
sq.pre=zeros(1,100);sq.x=zeros(1,100);sq.y=zeros(1,100);
; b  r" ]1 m+ f- \  aqh=0;%队头指针
  C0 f/ ~, T$ m1 zqe=1;%队尾指针' D' E) {. g  R/ b0 k2 U# P
maze(1,1)=-1;
( _3 Y+ c. A8 C# K2 o, |) O( w%第一个元素入队
5 Z3 r% D4 ]1 C2 W# U) a4 @sq.pre(1)=0;sq.x(1)=1;sq.y(1)=1;. x7 v9 Y6 @2 I5 h
( v) O  o" ^: A% A( ?4 K9 G
while qh-qe~=0
- u1 ~9 }) y# P5 oqh=qh+1;
9 ]( a& H7 `8 p* E2 ^9 ybb=0;
4 C# w7 @# ?+ zfor k=1:4) j) E4 Q6 F' I2 n3 g7 h
i=sq.x(qh)+fx(k);- M/ [; W. a  a, }' J  v6 y
j=sq.y(qh)+fy(k);& j: h$ m  J5 g: ~9 S" K
if check(i,j,maze)==1
* L$ `0 }, E  R. h0 o) w9 Yqe=qe+1;%入队
+ b- w: f0 X7 w" O6 g1 isq.x(qe)=i;sq.y(qe)=j;sq.pre(qe)=qh;7 E3 y' }0 ^: Z$ r" g
maze(i,j)=-1;- D: v/ M" a5 {. ]8 g7 S

0 e% Y+ v* U6 U" ^( [+ b6 i+ Pif i==8&j==8%如果为图最后一个点
" p9 N$ D5 {! j* g1 bwhile qe~=03 j( X3 ~" y% z3 l, W
sq.x(qe)
/ |' y* L0 V" f# Z/ U. Wsq.y(qe)   
/ ^+ F, ?7 n2 G/ w7 {2 l; z; jqe=sq.pre(qe);* b1 F1 y, W. l7 N8 P) I. z# @
end
3 e5 A" p7 C$ j) s2 k% wbb=1;
) b! \  T; g& J3 P6 w: t3 ~break;. G# D( o! O& Q% f4 Z% n
end %if0 y6 t3 @" f8 Q# h
end %if
& y5 |; g6 Q- o% Q6 Gend+ N; T3 ^1 Y/ @2 {( O0 g
if bb==13 S6 O, T9 i8 w% h
break
  Z6 }3 k& {4 Z9 ?# G+ |$ L/ W& q& ?end2 _9 }1 _" _0 p4 z! ?, c5 F
end%while) l; ^0 Q& S6 @1 @# I

6 g! o5 J7 C  ]1 a- ]9 N9 n1 R: {" r: A1 a- k
这段代码实现了一个广度优先搜索(BFS)算法,用于找到迷宫中从起点 (1,1) 到终点 (8,8) 的最短路径。4 M2 j' e5 e% |# E
以下是代码的详细解释:- H7 O/ M8 \& i8 |9 H1 K1 |% B
; o) z- R$ m9 s% L4 ~' E2 e! t* h- u
1.迷宫定义:: R. d0 R1 f2 Z5 V
2.maze 是一个8x8的矩阵,其中 0 表示可通行的路径,1 表示墙,-1 表示已经遍历过的路径。3 E4 M! f& o' ]. ~4 C, ]+ c
3.方向定义:+ S; g* ^2 O. U+ \* k8 P8 Q
4.fx 和 fy 定义了四个方向,即上、下、左、右的偏移量。
, {1 U: t( i, h( f/ @& b5.队列定义:7 X6 T$ T' T0 b; s
6.sq.pre, sq.x, sq.y 分别用于存储每个点的前一个点、x坐标和y坐标。
; N8 w2 M, I4 h7.qh 和 qe 分别是队列的头和尾的指针。) H3 ]5 S7 ]- m# }$ Y& n
8.初始设置
* ]5 [1 I/ V( R9.起点 (1,1) 被标记为 -1(已遍历),并加入队列。7 E! `. O' _% M; R! k4 L
10.广度优先搜索:  [4 \1 O( Y9 E/ u2 x' n
11.使用一个 while 循环来进行搜索,直到队列为空。: v" p5 \9 f8 h2 t/ g
12.在每一轮中,取出队头的点 (sq.x(qh), sq.y(qh)),然后尝试向四个方向移动。
& v$ T5 t$ {2 A3 U! Q) Q13.对于每个方向,如果新的坐标 (i, j) 是有效的(即在迷宫范围内且没有被遍历过),则将其标记为 -1(已遍历)并加入队列。
* S3 Q" w$ M1 G0 o1 K2 h6 J14.如果新的坐标是终点 (8,8),则从队列的尾部开始,回溯找到从终点到起点的路径。. I& D5 ?$ f! e
15.回溯路径:/ L! }- s: L% ~
16.如果找到终点,那么从 qe 开始,通过 sq.pre 数组回溯每个点的前一个点,直到回到起点。% i$ R3 `3 W3 F. |9 c8 W
这样,当代码执行完成后,sq.x 和 sq.y 的值将表示从起点到终点的最短路径。
6 U- M8 Y$ i. L9 |7 ~0 G  v
, \5 s  L1 d6 W& t
; V0 S2 P' Q! B$ u  D- l7 x: Q; I

广度优先搜索.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-7-28 04:50 , Processed in 0.439448 second(s), 55 queries .

回顶部