QQ登录

只需要一步,快速开始

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

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

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

1186

主题

4

听众

2922

积分

该用户从未签到

跳转到指定楼层
1#
发表于 2023-12-22 15:52 |只看该作者 |倒序浏览
|招呼Ta 关注Ta
clear all
( t2 ~5 o, u5 ~clc& a& |, h; b8 u; k# n
maze=[0,0,0,0,0,0,0,0;' }1 r! Y' y& e3 ~: Y! y' P
      0,1,1,1,1,0,1,0;
# c2 D4 |+ L; ]! F+ O      0,0,0,0,1,0,1,0;& ~4 Q, x- L) B
      0,1,0,0,0,0,1,0;- Q, y" I+ Y! y/ e2 T7 V
      0,1,0,1,1,0,1,0;
# |, A$ h6 Z$ g$ j: X      0,1,0,0,0,0,1,1;- ]' A8 B  H" ^' g/ X4 ~
      0,1,0,0,1,0,0,0;: E) f' [4 A$ W
      0,1,1,1,1,1,1,0];%迷宫:0为路,1为墙,-1为遍历过
0 H6 M: Y: G- ]9 z, ?2 Q2 Zfx(1:4)=[1,-1,0,0];5 V( p8 v$ [9 N- C
fy(1:4)=[0,0,-1,1];
% F$ w% h% e. K# bsq.pre=zeros(1,100);sq.x=zeros(1,100);sq.y=zeros(1,100);
( P6 U8 r9 U% Eqh=0;%队头指针' b- r2 Q' K( K$ c  |+ f
qe=1;%队尾指针& r7 s# `0 M& Q1 u0 L, U2 Z5 W( d1 l
maze(1,1)=-1;7 x: w0 d- V6 V/ p
%第一个元素入队1 M0 G. l% J% C3 L3 f
sq.pre(1)=0;sq.x(1)=1;sq.y(1)=1;0 h" L8 e$ Y# G2 b2 m

1 ]3 [. Z% d6 B5 A$ l0 swhile qh-qe~=0$ e) \) N6 o1 [" J
qh=qh+1;
/ H. w! a) c9 z% R( c7 M2 I6 Wbb=0;( `( U3 p. s, H- r* p$ x. K% ?
for k=1:4! N( A+ k6 A/ Y, N8 k" T
i=sq.x(qh)+fx(k);2 P- Z8 o7 s0 n3 J8 [& D1 W
j=sq.y(qh)+fy(k);& ^* T/ X5 Y1 \6 r" F4 a
if check(i,j,maze)==1
5 a6 E: I( M# h+ f' Qqe=qe+1;%入队6 N% k9 h  J+ z- n" j
sq.x(qe)=i;sq.y(qe)=j;sq.pre(qe)=qh;
- N- q) H. g$ O# t! h( Omaze(i,j)=-1;0 I: f3 C( L, d, a
) u  k8 U, f( f1 S; y0 k8 X* U
if i==8&j==8%如果为图最后一个点/ l7 X1 W* F! ?" I* q: t# C; E. K
while qe~=06 K7 Y. O% s, N! N* ]$ U1 w. l
sq.x(qe)
  Q9 Y* o$ V4 P2 R2 Ysq.y(qe)    % c" E$ s: X9 o6 S3 t+ g
qe=sq.pre(qe);
0 `' M2 v# i7 p! Z' U! b* ]end 3 c( h+ l7 t: K7 A7 e% R$ k
bb=1;
: ~0 o2 \; A+ F) ~* M/ @4 _) Ebreak;' X! ^/ }! I& C7 v
end %if
8 a  s; t5 p+ }  {6 C- Iend %if
8 g# n! n2 n1 Oend$ d3 [0 D$ ^3 y2 S1 a; \8 W
if bb==15 N5 I# }2 H6 Y- q
break
' Q9 @: i! a& [4 Dend7 e2 `6 x- i& ]  v
end%while
" ?- k, s! C8 d( l. ^: f8 {& u. g/ Y% r

3 ?0 F/ h' \3 l这段代码实现了一个广度优先搜索(BFS)算法,用于找到迷宫中从起点 (1,1) 到终点 (8,8) 的最短路径。
5 e7 D, Q0 V$ P4 W7 e- q2 [以下是代码的详细解释:" {0 ^' t" S. o6 Q5 X
. A" q9 {$ D/ x# t  G8 I6 P
1.迷宫定义:
$ q  E2 M+ C$ t. N1 h- S: ^4 I2.maze 是一个8x8的矩阵,其中 0 表示可通行的路径,1 表示墙,-1 表示已经遍历过的路径。- x! T  T' T( o
3.方向定义:' @; i! k% l2 k5 v; u
4.fx 和 fy 定义了四个方向,即上、下、左、右的偏移量。6 T% q4 Y6 \2 M, u
5.队列定义:
, ~# l: _7 C  [1 `1 n+ N" u/ I! K6 |1 D6.sq.pre, sq.x, sq.y 分别用于存储每个点的前一个点、x坐标和y坐标。* K4 j. U' G$ {) H; K  j6 E$ f
7.qh 和 qe 分别是队列的头和尾的指针。
3 X: n8 }* O/ W$ e) I8.初始设置
8 p( u; W/ V+ j9 q0 M0 i$ L9.起点 (1,1) 被标记为 -1(已遍历),并加入队列。6 r; ?" [9 B' V( r6 q2 ~) w7 B
10.广度优先搜索:
2 B5 {5 Z* [7 I11.使用一个 while 循环来进行搜索,直到队列为空。2 ]* Z- z& `, r0 ?( j
12.在每一轮中,取出队头的点 (sq.x(qh), sq.y(qh)),然后尝试向四个方向移动。
  P& S# j; V/ \- F  l5 ]/ z) l4 H/ \0 Z13.对于每个方向,如果新的坐标 (i, j) 是有效的(即在迷宫范围内且没有被遍历过),则将其标记为 -1(已遍历)并加入队列。
. X2 \0 D" @* S. Q, G14.如果新的坐标是终点 (8,8),则从队列的尾部开始,回溯找到从终点到起点的路径。# Y% h' W0 V$ g; F# T' S
15.回溯路径:
5 S; N: l2 r( F& [$ c. U' o2 D/ i16.如果找到终点,那么从 qe 开始,通过 sq.pre 数组回溯每个点的前一个点,直到回到起点。0 m* V0 c& A8 L8 i5 y  [
这样,当代码执行完成后,sq.x 和 sq.y 的值将表示从起点到终点的最短路径。
- ?& ?( N6 G; _. t% P% a' {8 g! P/ w1 L6 ?! Y. {
1 A: o( A. w) Y

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

回顶部