QQ登录

只需要一步,快速开始

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

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

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

1189

主题

4

听众

2934

积分

该用户从未签到

跳转到指定楼层
1#
发表于 2023-12-22 15:52 |只看该作者 |倒序浏览
|招呼Ta 关注Ta
clear all2 o0 V6 l6 ~& q: I7 I( C
clc
) a9 Q4 v" o5 v1 wmaze=[0,0,0,0,0,0,0,0;/ I' o6 L7 O2 I
      0,1,1,1,1,0,1,0;* S% h7 D5 J' q2 D+ b; w# r
      0,0,0,0,1,0,1,0;( C- @+ ^, K" _6 ~( E2 w: H' n
      0,1,0,0,0,0,1,0;
8 S% `( l; }. x; h, x3 `6 |% J      0,1,0,1,1,0,1,0;. t1 c( q% L/ F* a% N1 u- k
      0,1,0,0,0,0,1,1;8 b6 T6 z' q( f  @. m/ r/ Z
      0,1,0,0,1,0,0,0;
* q; p! d8 t) j      0,1,1,1,1,1,1,0];%迷宫:0为路,1为墙,-1为遍历过
: J) L4 e# u$ A: a% ufx(1:4)=[1,-1,0,0];
. G1 w+ v& O6 [& `- Z9 ~6 Yfy(1:4)=[0,0,-1,1];
* i' S2 T1 G) f1 P( K( x% Fsq.pre=zeros(1,100);sq.x=zeros(1,100);sq.y=zeros(1,100);
& l# @# U/ |3 ?! H8 |; I# w9 lqh=0;%队头指针* }& `  Q3 I* _/ T3 J9 o. o
qe=1;%队尾指针; R# |' Z! n( |( v: D4 C  M0 T7 @
maze(1,1)=-1;, W" L4 g5 G3 ~' A% D0 u* S! f" w
%第一个元素入队
0 v; P. X  h. M3 h. ]sq.pre(1)=0;sq.x(1)=1;sq.y(1)=1;+ N9 x3 N$ r6 ?. W0 J4 P

+ E4 c2 r) T# O) o3 e8 v* n" Twhile qh-qe~=0
% {. B2 n  W* ?6 s  f( aqh=qh+1;# E& d6 ?, k3 K# Y" B
bb=0;0 W% n8 k8 w- e/ ~/ C
for k=1:4
$ d" `- x5 [! D1 T" ]$ ti=sq.x(qh)+fx(k);& `& |3 ^) z) A  {+ M
j=sq.y(qh)+fy(k);( V* |0 C, ^% g7 G8 A, ?
if check(i,j,maze)==1
  ~& q8 \1 P: R' L, i+ o7 @- X; Gqe=qe+1;%入队+ |8 g5 F7 o( z; q4 T
sq.x(qe)=i;sq.y(qe)=j;sq.pre(qe)=qh;
5 |1 O  H8 ]+ e3 C0 E5 smaze(i,j)=-1;
. ^: ]2 R0 {) ^* h/ g; b
% E7 e. z* C3 }0 Y2 f8 q0 l5 K- v1 zif i==8&j==8%如果为图最后一个点: C: H% I1 i' w0 x8 H* t
while qe~=0' q" I) N7 q& A2 ]* K" X
sq.x(qe) : t3 _* \+ C' u* R
sq.y(qe)   
4 L: s! p* [. _6 U' Fqe=sq.pre(qe);
) ^; k/ a0 H) Z! [. t/ O( e1 H& ^' pend
. k! h$ \4 z2 z1 n1 dbb=1;
7 D0 Q+ j: t7 K# ^! l- [5 rbreak;
  X* f5 H! K" P9 d( d# b# J* g% @4 Send %if" `7 L7 n: c6 n% c
end %if
2 y* ^( c* A! r& X/ ?- Iend  p5 Q7 ]/ X8 t. W/ {3 \/ t# e
if bb==1
0 f, L2 ^7 Q2 H* ~break  Z" T: c/ a8 z8 V
end
  w, Y, a( ?- P8 Hend%while* g& p/ c: z/ c& A" Q

8 a0 x% d# |4 Z  @& y" ?7 s
0 g8 P$ `: o) I: i- @这段代码实现了一个广度优先搜索(BFS)算法,用于找到迷宫中从起点 (1,1) 到终点 (8,8) 的最短路径。
( J4 }9 @/ t$ g以下是代码的详细解释:5 V0 c+ b2 ]. p* E
) G1 W6 H0 H, i8 @' j& B7 d, E  \+ w
1.迷宫定义:
7 |0 w: `4 {! a* x: P2.maze 是一个8x8的矩阵,其中 0 表示可通行的路径,1 表示墙,-1 表示已经遍历过的路径。
1 u, q& F- D6 M3.方向定义:
( k3 x; o* s' D( ^7 q: e4.fx 和 fy 定义了四个方向,即上、下、左、右的偏移量。5 r, o( n9 k$ Y  f; R
5.队列定义:
4 Q: d8 V7 _- \+ {/ b6.sq.pre, sq.x, sq.y 分别用于存储每个点的前一个点、x坐标和y坐标。
+ ^; |  q1 q0 D- z- m" |' L7.qh 和 qe 分别是队列的头和尾的指针。9 _) Q* ~; J4 v+ a3 y& c1 E) ^
8.初始设置
8 ^  k! Y8 X- o7 b9.起点 (1,1) 被标记为 -1(已遍历),并加入队列。
9 U' Q: B1 t' n2 {, `10.广度优先搜索:
* G1 p6 G: x" J" z: z2 [( i11.使用一个 while 循环来进行搜索,直到队列为空。
) i8 ]3 J; I' K1 |6 E% F12.在每一轮中,取出队头的点 (sq.x(qh), sq.y(qh)),然后尝试向四个方向移动。
; B2 U3 t$ X7 R  j13.对于每个方向,如果新的坐标 (i, j) 是有效的(即在迷宫范围内且没有被遍历过),则将其标记为 -1(已遍历)并加入队列。
, L, V% [) |' p2 L% o- o' m14.如果新的坐标是终点 (8,8),则从队列的尾部开始,回溯找到从终点到起点的路径。( [7 m: T5 k: d  a9 v; i
15.回溯路径:: ]2 ~; h- l1 I4 e$ z0 Y
16.如果找到终点,那么从 qe 开始,通过 sq.pre 数组回溯每个点的前一个点,直到回到起点。$ |3 F5 l6 g6 n: ?1 r
这样,当代码执行完成后,sq.x 和 sq.y 的值将表示从起点到终点的最短路径。
( ~' b* B9 Q4 }. o+ }1 {/ T2 g, }/ d" s: h7 d" Q" s! [- p

/ n! C! S/ w# X! B# A6 e& _* q2 ~0 w

广度优先搜索.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-6-15 03:23 , Processed in 0.360004 second(s), 55 queries .

回顶部