QQ登录

只需要一步,快速开始

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

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

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

1186

主题

4

听众

2923

积分

该用户从未签到

跳转到指定楼层
1#
发表于 2023-12-22 15:52 |只看该作者 |倒序浏览
|招呼Ta 关注Ta
clear all
$ @9 j6 J  v% q( e4 a# j2 rclc" V# Z+ V$ B$ S  [4 \& J
maze=[0,0,0,0,0,0,0,0;+ J' O, F* s- S# n$ e
      0,1,1,1,1,0,1,0;5 Q3 G1 B) z; B! P5 U( v$ d
      0,0,0,0,1,0,1,0;, S% b) Z7 h3 X1 I! Y# \
      0,1,0,0,0,0,1,0;( J" m$ t5 y, m7 m/ ?
      0,1,0,1,1,0,1,0;
  E( S3 J* N2 t! T+ b  D      0,1,0,0,0,0,1,1;+ m" l: n! k  m7 N9 V) X
      0,1,0,0,1,0,0,0;
. f; I2 F# W: v6 J$ E      0,1,1,1,1,1,1,0];%迷宫:0为路,1为墙,-1为遍历过$ ^% o2 K5 N9 @3 t- t* \
fx(1:4)=[1,-1,0,0];
: A% Z: l2 D% l$ {fy(1:4)=[0,0,-1,1];/ O; o7 E8 V% r# ^3 H
sq.pre=zeros(1,100);sq.x=zeros(1,100);sq.y=zeros(1,100);
& t1 f4 j1 w6 b$ h1 r$ Sqh=0;%队头指针, x: n& ]- L! u
qe=1;%队尾指针
1 ^3 v- x7 x! F) G1 \maze(1,1)=-1;
, {6 `: m  G, z2 r%第一个元素入队
; X( ^, i$ z$ s/ \% @sq.pre(1)=0;sq.x(1)=1;sq.y(1)=1;
8 b0 W. I3 s8 _8 f8 ^# T, j. k- c% ?5 y  j# N
while qh-qe~=0+ S6 H" h" F: P, R* U4 y! @) U
qh=qh+1;" ]. @+ z* Q0 z  y2 S* ?
bb=0;
3 d: Y! t$ i, [7 L4 Ffor k=1:46 H. O% W( S& C8 v* k% X
i=sq.x(qh)+fx(k);
8 r& W8 r! D% H% Wj=sq.y(qh)+fy(k);( c6 Z/ x; }$ L  Z8 G" f
if check(i,j,maze)==1. u" [# p; v/ n' G1 e: o
qe=qe+1;%入队
/ Z9 ]0 J! S. C% l& \4 I8 ysq.x(qe)=i;sq.y(qe)=j;sq.pre(qe)=qh;) ^" M/ M) y# q2 h% b4 g
maze(i,j)=-1;" t& E1 G0 j8 o1 B

) P/ i8 n1 V& P8 i4 ^; P; Iif i==8&j==8%如果为图最后一个点1 F0 e$ v* y1 a, z; `* `/ `6 |  b
while qe~=0
# |* K" V9 ~5 v; r( ~( H: Fsq.x(qe)
/ ?! A+ w+ Z5 rsq.y(qe)    9 Y$ L% o, l7 b" u: @' w
qe=sq.pre(qe);5 Q, Y; z4 g6 A0 j% P
end % Q1 f/ g- r' Z( H
bb=1;) R) H) Q% ^# U* P. f# \% p  Y. v
break;
$ b6 b0 Z" D" c+ V+ u. @' f" q6 Fend %if
2 z0 U$ y* d: J3 H! R2 _4 cend %if+ n' c2 I$ }* O$ \( l3 X$ @' V0 Y% l6 H, e
end9 y6 F3 ^; i. k4 j7 x
if bb==1: l  `- b, {3 m/ P
break( z# J) J7 T& W8 r" y9 S/ p5 s
end
& F6 u9 E+ |5 f: L. r6 |' Q% {: bend%while
9 Z9 c" M; ~5 T: Q+ `! i8 B! E4 L* M9 ]

! U% t0 C6 p% }; I这段代码实现了一个广度优先搜索(BFS)算法,用于找到迷宫中从起点 (1,1) 到终点 (8,8) 的最短路径。& v( E* `* D+ k7 k2 O, c) `1 n
以下是代码的详细解释:' O2 D! D6 u1 c9 w! Y
, r1 O# R9 ~# C" I# M
1.迷宫定义:& |) H3 O  R$ S! a) t. W
2.maze 是一个8x8的矩阵,其中 0 表示可通行的路径,1 表示墙,-1 表示已经遍历过的路径。/ f' A+ M# a  A& |1 z
3.方向定义:
% \# p$ F6 [6 D! _0 Q: A4.fx 和 fy 定义了四个方向,即上、下、左、右的偏移量。/ x, a* i5 P1 v, j: ^; Y: ?
5.队列定义:
8 b" K9 q4 @) Z6 y/ t( `6.sq.pre, sq.x, sq.y 分别用于存储每个点的前一个点、x坐标和y坐标。
8 b0 I" j' B3 F* K# t7.qh 和 qe 分别是队列的头和尾的指针。
+ w, J0 z! p, i0 s* K/ D! T8.初始设置
- X8 O4 k$ ^8 B! }* P9.起点 (1,1) 被标记为 -1(已遍历),并加入队列。8 J* g/ a1 M# v' I) ]8 T. p
10.广度优先搜索:
5 J' |! s0 ?0 x/ n6 }11.使用一个 while 循环来进行搜索,直到队列为空。& f' z8 g2 ~' ~
12.在每一轮中,取出队头的点 (sq.x(qh), sq.y(qh)),然后尝试向四个方向移动。
% t- f' b& ^2 A! L, ]2 |13.对于每个方向,如果新的坐标 (i, j) 是有效的(即在迷宫范围内且没有被遍历过),则将其标记为 -1(已遍历)并加入队列。4 F% a2 X. u& c; v/ k/ z
14.如果新的坐标是终点 (8,8),则从队列的尾部开始,回溯找到从终点到起点的路径。
( _% _( F/ C1 L% Q& [+ B15.回溯路径:3 D4 r! g" ~6 A- H" q
16.如果找到终点,那么从 qe 开始,通过 sq.pre 数组回溯每个点的前一个点,直到回到起点。) `2 P& s4 V( c. ]0 G5 C
这样,当代码执行完成后,sq.x 和 sq.y 的值将表示从起点到终点的最短路径。( k3 ]- _+ @% \' X* w

+ u8 O! e" h/ z. H& t: n# Y" Z
7 F% W& O# \3 M

广度优先搜索.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-4-20 20:50 , Processed in 0.446451 second(s), 57 queries .

回顶部