QQ登录

只需要一步,快速开始

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

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

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

1189

主题

4

听众

2934

积分

该用户从未签到

跳转到指定楼层
1#
发表于 2023-12-22 15:52 |只看该作者 |倒序浏览
|招呼Ta 关注Ta
clear all
  }' s) p( [- S9 _' r6 Wclc
" V5 N5 X$ c/ R/ N" {) dmaze=[0,0,0,0,0,0,0,0;% t. {$ o4 y  R' X- A* f& _0 N
      0,1,1,1,1,0,1,0;
; s* t  A9 j# c% S9 h; S+ s      0,0,0,0,1,0,1,0;
* ~7 F- z. i3 v$ N) y1 O. W0 h      0,1,0,0,0,0,1,0;
0 b& B+ J/ G) E( J, S1 U      0,1,0,1,1,0,1,0;* `$ n& S1 b; x  w
      0,1,0,0,0,0,1,1;# t" c0 D) B/ a+ p& G
      0,1,0,0,1,0,0,0;
( f( N' j6 B# x: y% f5 g3 F; A      0,1,1,1,1,1,1,0];%迷宫:0为路,1为墙,-1为遍历过
0 \; h7 S9 k% Q6 J2 efx(1:4)=[1,-1,0,0];
$ }9 b6 P& D& bfy(1:4)=[0,0,-1,1];
- A* r0 N" q" }6 ^; k' p2 ssq.pre=zeros(1,100);sq.x=zeros(1,100);sq.y=zeros(1,100);4 ?1 i( ]+ d7 V
qh=0;%队头指针
2 v8 z$ [# }% qqe=1;%队尾指针
# H1 @$ v2 g3 C5 P) w4 Smaze(1,1)=-1;4 q& M* r' B( x
%第一个元素入队! p4 e1 P" B) t9 N+ u9 M. S% {
sq.pre(1)=0;sq.x(1)=1;sq.y(1)=1;# }: L6 q% `. {

' w9 `1 |& u3 k0 c1 Mwhile qh-qe~=0
* y# T: r3 I- q7 G5 xqh=qh+1;; M" ]& |" }8 o. g0 |4 f; m
bb=0;
1 R/ b3 {6 b4 X: z: u* gfor k=1:4: i4 T- b  {( r8 V
i=sq.x(qh)+fx(k);
0 K, C% x$ ^9 Q4 t3 Hj=sq.y(qh)+fy(k);  a" {+ l9 `/ [: I: V
if check(i,j,maze)==1' G  u& b* h- M. Z
qe=qe+1;%入队
% d2 w% P4 c' ^; Y6 X" U  Y5 }sq.x(qe)=i;sq.y(qe)=j;sq.pre(qe)=qh;; V3 J6 Q4 O' S1 F
maze(i,j)=-1;) V8 R! b. ~" c; D. ^
* q0 \- A1 D7 m$ i, \4 h
if i==8&j==8%如果为图最后一个点
2 [  |: H* N" D$ e4 E# ywhile qe~=0  q( q/ k  E* w! ~1 b
sq.x(qe) ; I4 B0 T3 F! Q: z3 ]
sq.y(qe)    & D4 a! c% l8 \: b" w
qe=sq.pre(qe);; g# q/ \# N& r7 L9 s
end
8 R1 N  o! Z, N% c4 Tbb=1;) K; y2 |; f; i( w) g
break;
3 t: U' g' [( M. E+ K5 b0 }end %if( G" z3 O5 u, S. F  ^; k
end %if& n+ C; U4 u$ r' T- q
end
5 F+ `7 L( X: E& Y1 N& W; e- Yif bb==11 \( r' n4 b% p9 [# v! {! I- e6 F
break
# M  b6 g& z, @( tend. E: C% x- n0 w* W% Q+ T
end%while
& s& D2 ]/ u2 |! I6 p* n8 M
* }6 h) p. S" d6 J( x$ ?* o5 k* [& B' Q' i. h6 a
这段代码实现了一个广度优先搜索(BFS)算法,用于找到迷宫中从起点 (1,1) 到终点 (8,8) 的最短路径。( M6 v; l( A- ?9 Y5 m
以下是代码的详细解释:) c0 R% w) K, j! b) P, y# j/ j

* A9 f8 g7 r6 P$ I1.迷宫定义:9 Y- u$ }2 L/ ?. p7 B/ u9 a# g
2.maze 是一个8x8的矩阵,其中 0 表示可通行的路径,1 表示墙,-1 表示已经遍历过的路径。
: o% l+ f8 Z0 F1 G0 y  T( K0 ]3.方向定义:
8 _5 M% Y/ C2 s& _4.fx 和 fy 定义了四个方向,即上、下、左、右的偏移量。. l/ v3 [) f3 q
5.队列定义:
2 c' a/ [5 s) e6 F6.sq.pre, sq.x, sq.y 分别用于存储每个点的前一个点、x坐标和y坐标。
" P# ?0 x/ x( x3 |" |; M1 P$ L( l7.qh 和 qe 分别是队列的头和尾的指针。
3 t& W' F; O0 Y4 V8.初始设置1 x3 c0 d9 O; y8 ?3 K
9.起点 (1,1) 被标记为 -1(已遍历),并加入队列。; U3 j2 d& b; ]6 j7 A: b: ?
10.广度优先搜索:
1 c6 e3 y7 K2 i# N; V11.使用一个 while 循环来进行搜索,直到队列为空。# D$ t4 ?) B2 j
12.在每一轮中,取出队头的点 (sq.x(qh), sq.y(qh)),然后尝试向四个方向移动。) N) r" Y. W  L/ e
13.对于每个方向,如果新的坐标 (i, j) 是有效的(即在迷宫范围内且没有被遍历过),则将其标记为 -1(已遍历)并加入队列。
0 _) k1 r7 T/ |0 z( N8 w14.如果新的坐标是终点 (8,8),则从队列的尾部开始,回溯找到从终点到起点的路径。
! [& X6 m8 W% w% R7 e0 s4 `: b6 _15.回溯路径:
% g7 ]1 F3 N0 ?+ t4 I16.如果找到终点,那么从 qe 开始,通过 sq.pre 数组回溯每个点的前一个点,直到回到起点。! a8 _: `& x9 M( ~2 n2 ?; h7 [
这样,当代码执行完成后,sq.x 和 sq.y 的值将表示从起点到终点的最短路径。8 V7 e5 l& `# G! Z9 c
  W! L3 X0 i: \, v* g( n! v

' B$ f& N5 m/ `2 i& 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-8-1 20:58 , Processed in 0.382356 second(s), 55 queries .

回顶部