QQ登录

只需要一步,快速开始

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

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

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

1186

主题

4

听众

2922

积分

该用户从未签到

跳转到指定楼层
1#
发表于 2023-12-22 15:52 |只看该作者 |正序浏览
|招呼Ta 关注Ta
clear all6 Z* _7 c" {% M/ B* s( M5 F
clc
& r# Z0 u3 d  `1 O  r" a$ zmaze=[0,0,0,0,0,0,0,0;1 N0 _2 @$ E; Q) Q1 h9 ~( o
      0,1,1,1,1,0,1,0;
( q" v) }" ~: g4 X$ F      0,0,0,0,1,0,1,0;+ k6 z! h* {6 V
      0,1,0,0,0,0,1,0;5 A( G8 B7 n$ Z
      0,1,0,1,1,0,1,0;" g5 o8 c2 ?, D  ]
      0,1,0,0,0,0,1,1;
; v1 `: m- w2 q; G+ U      0,1,0,0,1,0,0,0;! ^1 y6 K6 ?5 d# E# i/ V* x
      0,1,1,1,1,1,1,0];%迷宫:0为路,1为墙,-1为遍历过' E& X9 h$ J8 _
fx(1:4)=[1,-1,0,0];
7 y/ D. f% t- I: _+ _fy(1:4)=[0,0,-1,1];
6 d( r2 u6 {4 `' C$ D& f  msq.pre=zeros(1,100);sq.x=zeros(1,100);sq.y=zeros(1,100);: }" d# v" N/ m9 H& r/ I
qh=0;%队头指针; ]& P( X/ _6 v- {7 V7 e8 G9 v
qe=1;%队尾指针" @& w0 t1 u1 u7 _' n' Q# \2 L# P) Q
maze(1,1)=-1;! S; I! T" l5 O7 C/ g! Y
%第一个元素入队3 D8 u. ]6 C, `. _8 _
sq.pre(1)=0;sq.x(1)=1;sq.y(1)=1;' G7 q$ m. c% E: M3 U

  x& l' r2 l: }. ~: V: ~" Kwhile qh-qe~=08 N* O# l' e4 f; T. Z' ?
qh=qh+1;0 j0 e5 ~5 E4 ?% Y0 K
bb=0;
$ o: e: a( B% {( b4 Wfor k=1:4
7 p5 t' @0 \) k- x* j/ hi=sq.x(qh)+fx(k);
* p/ m; K- N- {3 Bj=sq.y(qh)+fy(k);
  I5 [( ?' x" m* m" J! [. bif check(i,j,maze)==1& R% Q1 p1 Z' b, B9 X1 V
qe=qe+1;%入队  ^! \, `' |$ f$ J
sq.x(qe)=i;sq.y(qe)=j;sq.pre(qe)=qh;9 b- Y5 ?4 E- @
maze(i,j)=-1;  D, r2 z6 {) x
8 i) g  d- f0 K4 ^8 Q* l5 @
if i==8&j==8%如果为图最后一个点
, ~+ o4 ]9 _5 w1 z% }8 Dwhile qe~=0
8 y. t3 q6 q+ Y" C. `# }2 {( @sq.x(qe)
: L: e- {: M3 O) z+ h7 ~; B* vsq.y(qe)   
1 w6 }; ^/ `/ C+ uqe=sq.pre(qe);
+ g4 \$ m6 g7 J% J9 B& Kend 2 z4 t+ x! p* }, Z
bb=1;
1 a, u2 m" L2 }7 U( O8 {3 f8 nbreak;: b% X+ N- p2 X$ E/ ?
end %if
( b# r3 s! a+ M1 d2 d6 N" oend %if
4 k. Q$ q; m) s0 mend6 k7 e  N1 t: Y" R0 i) n% T
if bb==1
. I) b7 j- D" T$ r  N- S; l1 W. a5 |break
* h8 V" `+ [2 X. u! C% ], v* E! V( Pend
1 r! A% d6 \# Y; T+ H! g# j2 wend%while# U' z* `' ]! y; l+ h

0 {# k* P3 r8 s: ?
3 S- x; Y- k/ X% E5 J8 l& z! T这段代码实现了一个广度优先搜索(BFS)算法,用于找到迷宫中从起点 (1,1) 到终点 (8,8) 的最短路径。
, d! a; P) h' @% K+ {# x0 Z以下是代码的详细解释:+ H2 P) S# w5 |4 ~! W: |3 }; B! P
; \! ?+ N; ^) m
1.迷宫定义:
; \7 I/ {$ ~3 O  ?/ w% U& D2.maze 是一个8x8的矩阵,其中 0 表示可通行的路径,1 表示墙,-1 表示已经遍历过的路径。0 i+ u+ v+ i: l5 M/ L  K  Y
3.方向定义:
9 h" G3 U$ O6 H8 ]2 P# \; M4.fx 和 fy 定义了四个方向,即上、下、左、右的偏移量。
! ]$ n# g( ]- i( z5.队列定义:/ t+ I( j9 O# V, @: d
6.sq.pre, sq.x, sq.y 分别用于存储每个点的前一个点、x坐标和y坐标。9 M* q- ?/ H- S
7.qh 和 qe 分别是队列的头和尾的指针。  T  i) W/ z5 Y- k0 K0 r- Y
8.初始设置( g2 u8 J9 L  B' L. b
9.起点 (1,1) 被标记为 -1(已遍历),并加入队列。% l9 R; f2 g3 x/ Z
10.广度优先搜索:8 [3 B5 ^* B, U3 ~! o  \8 J! F) r
11.使用一个 while 循环来进行搜索,直到队列为空。
; D1 X& o4 p* q: d) j12.在每一轮中,取出队头的点 (sq.x(qh), sq.y(qh)),然后尝试向四个方向移动。
4 D& I8 k4 \! T2 u: e4 a13.对于每个方向,如果新的坐标 (i, j) 是有效的(即在迷宫范围内且没有被遍历过),则将其标记为 -1(已遍历)并加入队列。% w1 A; u! o. ?) B- Q: W
14.如果新的坐标是终点 (8,8),则从队列的尾部开始,回溯找到从终点到起点的路径。. {) p2 p3 w5 v! Q
15.回溯路径:8 m5 i+ w; z+ A
16.如果找到终点,那么从 qe 开始,通过 sq.pre 数组回溯每个点的前一个点,直到回到起点。! |/ A* C1 b# `" e; B. [3 {0 }( y
这样,当代码执行完成后,sq.x 和 sq.y 的值将表示从起点到终点的最短路径。! U) t0 M2 F( r0 I  F. W

' L7 N; [$ c( u# P: H# T9 o! m$ ]5 T5 G- P5 W' Y, m" i$ d

广度优先搜索.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-16 16:08 , Processed in 0.402504 second(s), 56 queries .

回顶部