QQ登录

只需要一步,快速开始

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

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

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

1171

主题

4

听众

2780

积分

该用户从未签到

跳转到指定楼层
1#
发表于 2023-12-22 15:52 |只看该作者 |倒序浏览
|招呼Ta 关注Ta
clear all: Y- a9 |! N7 ]* c, h% @0 u
clc
1 S6 u/ `. e; [7 c6 \maze=[0,0,0,0,0,0,0,0;
5 k, k. l, I1 S& L' y      0,1,1,1,1,0,1,0;% S. X  k% `3 g; K, a6 e
      0,0,0,0,1,0,1,0;
+ T/ w3 k9 g4 h' @$ E2 l8 _! d      0,1,0,0,0,0,1,0;
0 y1 f( c9 A8 p$ J) G0 B4 w% a      0,1,0,1,1,0,1,0;- a4 A+ e- O3 A
      0,1,0,0,0,0,1,1;  c, }3 T6 H% Z6 m, O5 m& R6 F5 y
      0,1,0,0,1,0,0,0;  ?. |9 _5 ~. S/ L" {0 [
      0,1,1,1,1,1,1,0];%迷宫:0为路,1为墙,-1为遍历过
* K4 g* c( u) Wfx(1:4)=[1,-1,0,0];
0 N/ I# @: |7 W( e3 Hfy(1:4)=[0,0,-1,1];; V4 ?/ v, U+ g5 V) v* G
sq.pre=zeros(1,100);sq.x=zeros(1,100);sq.y=zeros(1,100);/ @/ G  i) u/ @7 {, L% ^
qh=0;%队头指针+ P6 w0 t+ U% G$ e; [& w
qe=1;%队尾指针
% U& D3 y" a! D5 |1 jmaze(1,1)=-1;* r9 T/ i% o  ?9 ?# m6 z- F
%第一个元素入队- v4 s5 v* [, L4 g7 k/ o# v
sq.pre(1)=0;sq.x(1)=1;sq.y(1)=1;0 n+ `) x$ l$ b

' y, M1 s1 j# c6 e( V2 Wwhile qh-qe~=0
4 y2 F- c+ L: w6 q/ B# O, sqh=qh+1;
1 h7 y. g; i4 Y9 \& P, q0 i1 jbb=0;1 l; \. j/ V: E) s) F: q$ C- ]
for k=1:4
& o6 d6 H; O4 F) i/ F+ v% R$ K+ \i=sq.x(qh)+fx(k);; ?) J7 u- k' m- S# d
j=sq.y(qh)+fy(k);" w. S  @% Q: r4 Y
if check(i,j,maze)==1& N- k2 q- m! a! V
qe=qe+1;%入队
9 Q; @7 ]3 Z, a. o1 o1 |sq.x(qe)=i;sq.y(qe)=j;sq.pre(qe)=qh;- c4 l- R2 U5 b
maze(i,j)=-1;- ~9 {4 C0 @1 ^! v5 C/ u4 J3 G( A3 L

: o# s/ k, s, B3 T$ f* S+ {" Rif i==8&j==8%如果为图最后一个点. L" O. \- t3 C
while qe~=0- k9 b6 G2 \$ q4 K
sq.x(qe)
7 M0 ]" B" B7 n0 f" S! ssq.y(qe)    ; j: C4 v6 ~; g/ e" O
qe=sq.pre(qe);# _0 D& \7 B& D: f! J
end
" F% \; t& r- v( V7 Vbb=1;4 l1 }( e$ [1 L. G9 c
break;0 U1 K2 K4 ~+ |2 G& `# j
end %if
4 ?) G2 N$ H8 x5 B/ h  G: _  {end %if  _9 R# R! X- C" A" ~1 j
end
  C2 Y( M8 s% e' @7 Fif bb==10 B0 L8 n5 v8 v9 k" S
break2 B% Q# h% w6 w- Z3 X
end, ^$ a0 y) {% @, g9 [' Z
end%while# w+ ?  }8 O: T/ k

" Q: V5 t$ t' a/ y# {  V0 ]5 E$ ]- u$ t, I* J# a2 _/ O
这段代码实现了一个广度优先搜索(BFS)算法,用于找到迷宫中从起点 (1,1) 到终点 (8,8) 的最短路径。8 b4 c# I$ O% ]
以下是代码的详细解释:- D5 F6 N  t0 j: t9 w- |- `2 T. m( T

; c6 P. l8 G* G5 s  ?1.迷宫定义:( S# Z  j! {$ k) j' q5 a  k2 u
2.maze 是一个8x8的矩阵,其中 0 表示可通行的路径,1 表示墙,-1 表示已经遍历过的路径。
: ^6 a6 t  i: d& N! X+ i# v3.方向定义:  P/ n9 r3 _; J" q' g- r9 ~
4.fx 和 fy 定义了四个方向,即上、下、左、右的偏移量。
+ B* P% ?7 G5 o, `5.队列定义:" d/ Q+ y  w' {, |: F
6.sq.pre, sq.x, sq.y 分别用于存储每个点的前一个点、x坐标和y坐标。# [8 r: [; c3 v2 b, S# H
7.qh 和 qe 分别是队列的头和尾的指针。
" C6 l! Z# G7 P6 y3 h2 \- X8.初始设置3 j) b8 N' c, u" P. `# S
9.起点 (1,1) 被标记为 -1(已遍历),并加入队列。
9 z. A* G1 t* b10.广度优先搜索:
+ V3 U7 D" b) z3 H11.使用一个 while 循环来进行搜索,直到队列为空。  y: `) e' p' E2 U& f5 p
12.在每一轮中,取出队头的点 (sq.x(qh), sq.y(qh)),然后尝试向四个方向移动。4 u; Y8 b! _' s  T
13.对于每个方向,如果新的坐标 (i, j) 是有效的(即在迷宫范围内且没有被遍历过),则将其标记为 -1(已遍历)并加入队列。+ p* U8 {- l* \
14.如果新的坐标是终点 (8,8),则从队列的尾部开始,回溯找到从终点到起点的路径。4 m9 n: ?4 y  `  \4 \, N7 F
15.回溯路径:( @- L0 M6 P' z  h' O! [/ K7 J
16.如果找到终点,那么从 qe 开始,通过 sq.pre 数组回溯每个点的前一个点,直到回到起点。
0 ^/ C* l3 Q1 ~6 q. t) T这样,当代码执行完成后,sq.x 和 sq.y 的值将表示从起点到终点的最短路径。! z$ z& p' ?" g* M0 W) O1 T/ F% ^
/ |8 @  Y4 H2 ]( d+ C" p" v
, \1 D1 S1 l5 S8 }  ~: 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, 2025-6-23 08:17 , Processed in 0.470509 second(s), 55 queries .

回顶部