QQ登录

只需要一步,快速开始

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

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

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

1192

主题

4

听众

2946

积分

该用户从未签到

跳转到指定楼层
1#
发表于 2023-12-22 15:52 |只看该作者 |倒序浏览
|招呼Ta 关注Ta
clear all
% r) j) B9 x4 `) T9 |" m4 v8 B( dclc
' l4 X4 r8 _* O* V  C6 @- mmaze=[0,0,0,0,0,0,0,0;
  u, }- F2 N- }- o      0,1,1,1,1,0,1,0;
3 L1 I3 e! J/ `5 m/ t' s1 E# z8 {      0,0,0,0,1,0,1,0;; h! ~& V* p1 ?
      0,1,0,0,0,0,1,0;/ e( [. Z, S. z$ ^
      0,1,0,1,1,0,1,0;
/ G$ f$ t3 p4 V! u      0,1,0,0,0,0,1,1;
& g& K6 a9 C# ^2 I3 i      0,1,0,0,1,0,0,0;
. h3 {- T9 `% u2 K4 b  t- a) B6 K5 \      0,1,1,1,1,1,1,0];%迷宫:0为路,1为墙,-1为遍历过
9 o; u( ^% ^( N* `# @1 Bfx(1:4)=[1,-1,0,0];
5 a! q/ w; q  e6 ffy(1:4)=[0,0,-1,1];( x6 S2 L" `$ ]7 W. A; o3 i
sq.pre=zeros(1,100);sq.x=zeros(1,100);sq.y=zeros(1,100);3 i) `: l& U* @! ^+ p4 k+ L/ P
qh=0;%队头指针
9 q% |; x7 ?; _, B% Rqe=1;%队尾指针
9 U& z  D% X8 u# e% V) h5 X% g8 wmaze(1,1)=-1;- T9 y6 ]1 {0 y1 `* C
%第一个元素入队
' k# c$ {' g) K, Ssq.pre(1)=0;sq.x(1)=1;sq.y(1)=1;2 K5 p$ h: y% _2 H/ F# O: _: X
6 C* z, U" Z4 Y' \
while qh-qe~=0
/ `( ?, M1 c& Wqh=qh+1;
+ h; _6 C  h* k% I$ Nbb=0;
6 B7 [4 y& L) sfor k=1:4
7 C0 Q& g2 S% b& U7 B8 }$ g' i- q" ~i=sq.x(qh)+fx(k);
5 C; {: i6 T6 ~; d. E- l( y4 B# hj=sq.y(qh)+fy(k);4 q7 I) n0 v1 O+ W
if check(i,j,maze)==1
* t8 n: j& o! X3 aqe=qe+1;%入队1 Y8 G+ k& ]/ e: _1 S' `
sq.x(qe)=i;sq.y(qe)=j;sq.pre(qe)=qh;
# E. k8 h* i: w$ r5 B- ^1 P9 Bmaze(i,j)=-1;
& [8 |( z# }* Z/ Q) F& L6 `" `& N" c/ ]6 j! E
if i==8&j==8%如果为图最后一个点. e2 I) A' H4 h
while qe~=0. w( D. V$ q2 b0 d
sq.x(qe)
! g1 e+ X2 m2 z# W8 @; f* Asq.y(qe)   
8 l; E+ p8 ~3 D% E. Aqe=sq.pre(qe);
7 v1 P  Q% _6 V7 y( Z1 Hend
, m, w8 p# m* Pbb=1;& O  h, F) M: \8 j
break;7 j; F9 h1 t" N: a! a( E4 v
end %if. F3 Z7 l2 i) n" ]
end %if8 U# d- n( n7 o" \& Q6 w
end% j. A* @' m8 c' k% B
if bb==1
+ {6 x9 C( \' g" }1 V. K- c2 E) hbreak
+ W) z6 x7 Z! l4 U# wend7 B+ [0 D' E( ^
end%while& [0 t9 \' U/ e9 q1 e. h
9 d" T1 N. \; a" `
, O9 s9 K5 O4 c7 b; B5 ~9 r  T
这段代码实现了一个广度优先搜索(BFS)算法,用于找到迷宫中从起点 (1,1) 到终点 (8,8) 的最短路径。
& G3 L2 t5 P1 D8 P& r9 A  E; Z) {! L以下是代码的详细解释:. [" H2 k9 A* K4 p& K
2 p( v  J  y9 \  d5 n' z
1.迷宫定义:( V) p- j+ }9 E" \$ y
2.maze 是一个8x8的矩阵,其中 0 表示可通行的路径,1 表示墙,-1 表示已经遍历过的路径。
7 A3 t9 E: ?& L8 l  Z$ \3.方向定义:4 a5 c1 ?( z. e
4.fx 和 fy 定义了四个方向,即上、下、左、右的偏移量。/ x7 U! n! S1 u- [; n  M  J, s
5.队列定义:
  p- _. r6 t& N0 k& a. K6.sq.pre, sq.x, sq.y 分别用于存储每个点的前一个点、x坐标和y坐标。
- h' f- v# H* M( N, \7.qh 和 qe 分别是队列的头和尾的指针。5 ?2 w" Z0 M8 K; T3 B' v+ |2 u
8.初始设置! E2 l' D, c8 L; k* W
9.起点 (1,1) 被标记为 -1(已遍历),并加入队列。
% k! _3 V8 ^6 V- w5 c8 x5 T10.广度优先搜索:
2 w+ I6 t8 R+ J/ B$ m6 K11.使用一个 while 循环来进行搜索,直到队列为空。5 M& U# Y3 Y* P9 z$ @
12.在每一轮中,取出队头的点 (sq.x(qh), sq.y(qh)),然后尝试向四个方向移动。
7 V0 V/ C- j0 H13.对于每个方向,如果新的坐标 (i, j) 是有效的(即在迷宫范围内且没有被遍历过),则将其标记为 -1(已遍历)并加入队列。0 R8 N7 z4 S4 h; ~! Z# z
14.如果新的坐标是终点 (8,8),则从队列的尾部开始,回溯找到从终点到起点的路径。
! s2 @' X* U7 x$ p15.回溯路径:7 w( S7 s) l" P. t
16.如果找到终点,那么从 qe 开始,通过 sq.pre 数组回溯每个点的前一个点,直到回到起点。$ b4 t- P! q: s1 ^" a. ]
这样,当代码执行完成后,sq.x 和 sq.y 的值将表示从起点到终点的最短路径。
1 r! v- N& I+ c8 \/ H4 l# I' q3 a9 L. b1 S- X7 D; D

% M+ R; A4 ~! l8 s5 g1 v

广度优先搜索.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-26 03:13 , Processed in 0.389756 second(s), 55 queries .

回顶部