QQ登录

只需要一步,快速开始

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

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

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

1175

主题

4

听众

2823

积分

该用户从未签到

跳转到指定楼层
1#
发表于 2023-12-22 15:52 |只看该作者 |倒序浏览
|招呼Ta 关注Ta
clear all
$ ~2 p: z. z$ \# I* `7 ?( {+ h5 yclc
! L! g8 O2 `/ l0 T6 Dmaze=[0,0,0,0,0,0,0,0;# f% u6 @  r1 ]6 |% C4 s
      0,1,1,1,1,0,1,0;. }- ^7 [* E2 b. Z3 Q
      0,0,0,0,1,0,1,0;" a7 D: u. @& e4 v8 M$ F3 `
      0,1,0,0,0,0,1,0;
- T  v! g4 K0 ^, @      0,1,0,1,1,0,1,0;1 X- v7 ?5 M  I# U; {2 p: F
      0,1,0,0,0,0,1,1;& m; x. ], }" A0 r( ~
      0,1,0,0,1,0,0,0;
# ^+ n" }( i7 a      0,1,1,1,1,1,1,0];%迷宫:0为路,1为墙,-1为遍历过
" O. P& q* _5 N' X3 x, Lfx(1:4)=[1,-1,0,0];  D  m7 `, M! j8 R6 _
fy(1:4)=[0,0,-1,1];" A" o5 ?# m5 @% s8 ~
sq.pre=zeros(1,100);sq.x=zeros(1,100);sq.y=zeros(1,100);. `( n# f1 n" C+ J
qh=0;%队头指针/ e7 b0 y+ w8 [/ G: j
qe=1;%队尾指针
4 \% q/ z. F( q4 w+ O3 r- Fmaze(1,1)=-1;
5 x2 \) ]3 ]; m) N%第一个元素入队7 H# ~& H% e# M& B
sq.pre(1)=0;sq.x(1)=1;sq.y(1)=1;/ m7 y" U3 c3 B: O) w' G5 Z# z

3 p7 ^" T0 v6 L: H  Q; i8 O0 Vwhile qh-qe~=0
$ X: D' m+ H. m3 U; C8 ]qh=qh+1;
7 i& A" s/ h5 x) z1 u& Nbb=0;  Q! a# ]3 H6 E* H( G* N
for k=1:4
) Z$ G* b# z7 ]i=sq.x(qh)+fx(k);
1 B- Z- J+ _2 ]% t4 v, jj=sq.y(qh)+fy(k);0 b2 A. w- i4 j$ ^$ ]
if check(i,j,maze)==1
9 D6 T  D3 u: A* `qe=qe+1;%入队
2 g" n" P- i; E: B& p' u  ]8 Psq.x(qe)=i;sq.y(qe)=j;sq.pre(qe)=qh;+ u/ |3 c5 S2 u" l3 \" @7 N
maze(i,j)=-1;9 ?: `6 U: B" b2 N

% Z% M- P  a; s* u/ G: [! v3 k2 aif i==8&j==8%如果为图最后一个点) m8 R3 ?+ @, s. K" m% F9 g+ f
while qe~=0
/ {, S; o! ~* S! U1 N4 v1 V! Zsq.x(qe)
; c" f( Q+ j2 U; U/ z7 usq.y(qe)   
8 [9 e  x5 \. k; Mqe=sq.pre(qe);* O3 y5 i' _1 O
end
* W0 [6 Y- ]4 p( v# mbb=1;7 B9 z. ?& k* @/ e) `
break;
! p/ o# l1 K! Pend %if
# I5 l% x4 l5 E+ s" a6 G/ send %if
1 @2 `; L0 X% Z: [& Pend
: t* C3 ~+ y# `: {+ c5 W1 a7 z" Bif bb==1
  h% g0 h& E4 w" _; rbreak8 y4 }: ^! y7 Y/ N  O. S& r
end
8 j. f5 @) ]/ g% C" h3 D# E/ a8 uend%while0 d5 i- n" I5 t: F

4 H& P, ]5 v6 C5 j  n% h8 Z+ l) m) X1 h" K4 B- O" x
这段代码实现了一个广度优先搜索(BFS)算法,用于找到迷宫中从起点 (1,1) 到终点 (8,8) 的最短路径。2 y, y# W' J+ W9 q0 s' l: X
以下是代码的详细解释:  j+ @  q; v( b* d! W

& \$ Y7 v: Q! \4 e3 }1.迷宫定义:% v& j/ E0 m' G% Q1 B
2.maze 是一个8x8的矩阵,其中 0 表示可通行的路径,1 表示墙,-1 表示已经遍历过的路径。
0 e# \' {  w! o" v9 E3.方向定义:
# K* C0 d: F" s( h" t, G% V4.fx 和 fy 定义了四个方向,即上、下、左、右的偏移量。; y5 @, a0 I. U
5.队列定义:0 w% L: R8 K) X0 _' n+ u! D" g
6.sq.pre, sq.x, sq.y 分别用于存储每个点的前一个点、x坐标和y坐标。
& S7 K: k) z' W# `7.qh 和 qe 分别是队列的头和尾的指针。3 m/ m: z+ L% _+ ?/ z3 P
8.初始设置
; J0 Q; i- e/ H1 Z, ^5 V9.起点 (1,1) 被标记为 -1(已遍历),并加入队列。- M. x5 ?. K; p- ^
10.广度优先搜索:
  {1 o; T2 d! l: T11.使用一个 while 循环来进行搜索,直到队列为空。
- \  @8 \* Q/ v$ t9 `( v12.在每一轮中,取出队头的点 (sq.x(qh), sq.y(qh)),然后尝试向四个方向移动。
% t+ y- g8 V: Z1 z( n+ d" o13.对于每个方向,如果新的坐标 (i, j) 是有效的(即在迷宫范围内且没有被遍历过),则将其标记为 -1(已遍历)并加入队列。
0 Q/ Z/ R7 p! Z( t7 J3 m+ n14.如果新的坐标是终点 (8,8),则从队列的尾部开始,回溯找到从终点到起点的路径。) e- [7 r, J3 A, T9 ]( p+ z
15.回溯路径:
; \( h' o# b+ T% f16.如果找到终点,那么从 qe 开始,通过 sq.pre 数组回溯每个点的前一个点,直到回到起点。
1 s) ?/ ], L. N  |1 o这样,当代码执行完成后,sq.x 和 sq.y 的值将表示从起点到终点的最短路径。
3 V! g8 J; c6 j! t  a/ V, C& ]& w  ~- S; f7 Y2 t3 [

& G3 w  f$ W8 _! t$ {4 A2 z

广度优先搜索.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, 2025-7-21 03:03 , Processed in 0.467170 second(s), 54 queries .

回顶部