QQ登录

只需要一步,快速开始

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

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

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

1198

主题

4

听众

2978

积分

该用户从未签到

跳转到指定楼层
1#
发表于 2023-12-22 15:52 |只看该作者 |倒序浏览
|招呼Ta 关注Ta
clear all
$ w4 t+ J+ j3 cclc3 M& R- O7 B' Y+ s' O7 q$ u; T
maze=[0,0,0,0,0,0,0,0;! Y* Y- t  i$ c5 O' i9 c
      0,1,1,1,1,0,1,0;) Q- i7 Q! S1 i' z
      0,0,0,0,1,0,1,0;0 b( p# R* i& _5 k! I  v* D
      0,1,0,0,0,0,1,0;( i+ p/ y+ T( M% x! X) \$ ^- f
      0,1,0,1,1,0,1,0;
3 \8 P) q3 p: `* [. }      0,1,0,0,0,0,1,1;
. K* d- S; p, e0 G8 K' m* [      0,1,0,0,1,0,0,0;& u4 n; e& H( b; [0 M/ F. L1 Y1 W
      0,1,1,1,1,1,1,0];%迷宫:0为路,1为墙,-1为遍历过3 {: w' N2 g3 r4 _, h
fx(1:4)=[1,-1,0,0];4 k2 _' i- B( u- S7 f
fy(1:4)=[0,0,-1,1];5 ?4 ~$ o1 ?0 S9 B- `* ?6 P
sq.pre=zeros(1,100);sq.x=zeros(1,100);sq.y=zeros(1,100);
+ H. C& z8 Y$ x" hqh=0;%队头指针1 C4 s7 O+ X+ n. |0 ~
qe=1;%队尾指针$ ?8 u! N' F8 e4 _4 H$ x7 I# T: l# \
maze(1,1)=-1;7 a  s2 R0 v( w4 ^5 p2 q
%第一个元素入队8 p  Q, d" s+ S, S5 F0 t: J' E
sq.pre(1)=0;sq.x(1)=1;sq.y(1)=1;; a  y: r% [/ v2 p$ U6 A* u

, d# \* j0 ?/ P5 X3 w" mwhile qh-qe~=0
) F8 M& r+ ~$ @7 A7 z' ?: B4 Xqh=qh+1;, D! Y* ^5 i5 x
bb=0;
; j$ Y' U* v) C9 Vfor k=1:4  K0 q  M5 E4 a, D+ f- m  S* A6 i
i=sq.x(qh)+fx(k);% q9 d& L! e9 h7 j+ Q/ Y
j=sq.y(qh)+fy(k);( p  ?* f4 s  f$ H( a
if check(i,j,maze)==14 x, k; z* j! n9 N$ m* y$ n8 |
qe=qe+1;%入队+ }" j8 R; L8 V7 F/ Z6 \
sq.x(qe)=i;sq.y(qe)=j;sq.pre(qe)=qh;" D1 N+ T+ o. y* _+ g2 F; w
maze(i,j)=-1;+ ?- h5 g% G  b  _6 D

# L6 K5 n$ l, V# A  P! |" U' r& dif i==8&j==8%如果为图最后一个点
% k0 [, B/ C+ j/ j) _- pwhile qe~=05 Q/ _5 L5 D: ]3 o1 b$ X
sq.x(qe) 5 O* i9 w8 J5 l  @
sq.y(qe)   
, q) |; V$ m0 w7 \/ qqe=sq.pre(qe);% S; t0 ~2 r& {8 A5 L
end , R7 T& a, P- r- u, x7 |3 J, p/ I
bb=1;' G) W0 ~  T2 |+ ]/ Y7 w
break;
4 z5 Q6 h6 z+ H# U9 ]! n/ T; dend %if
& v! e: h' O+ W2 {6 zend %if
& C2 q7 d" J* h5 R# s9 @end3 L" [4 Q) {& p: G
if bb==1; ^' m1 Z4 @9 W
break0 N* Y  Y: Q  ?1 L
end* ^$ ~- \0 \$ Q4 h# m
end%while
8 W3 k' K" D( }
& j! k& N. }8 d  }4 X: I$ I
- ?2 I* z: V: j4 {* ~7 U这段代码实现了一个广度优先搜索(BFS)算法,用于找到迷宫中从起点 (1,1) 到终点 (8,8) 的最短路径。
8 B: t- U, h! t- x5 c- n以下是代码的详细解释:# c& j' q2 C" |) Z) W0 D. P

  |0 j9 e2 M% d3 Y9 r2 x1.迷宫定义:
) @! Q" b* l1 y- L8 h  R$ G6 h2.maze 是一个8x8的矩阵,其中 0 表示可通行的路径,1 表示墙,-1 表示已经遍历过的路径。
* a5 ], b$ a: `; T) L& M3.方向定义:
! v! n+ V5 W$ |0 G4.fx 和 fy 定义了四个方向,即上、下、左、右的偏移量。/ C7 b$ @+ }$ P
5.队列定义:: P5 E6 Q* z& i$ m$ J7 V
6.sq.pre, sq.x, sq.y 分别用于存储每个点的前一个点、x坐标和y坐标。% h/ a3 P5 h) F. g$ Q
7.qh 和 qe 分别是队列的头和尾的指针。
4 W* A7 i' A% H* S9 u8.初始设置
9 O* w* a7 l6 }9.起点 (1,1) 被标记为 -1(已遍历),并加入队列。
/ f: _% H6 ]7 Y* v- w1 Y10.广度优先搜索:
" ]1 P' F/ C& E6 c% ]% u11.使用一个 while 循环来进行搜索,直到队列为空。
3 U# v8 r; C) L4 T& W. y12.在每一轮中,取出队头的点 (sq.x(qh), sq.y(qh)),然后尝试向四个方向移动。
3 C' ^. d; h6 e7 F% V7 S+ w/ E13.对于每个方向,如果新的坐标 (i, j) 是有效的(即在迷宫范围内且没有被遍历过),则将其标记为 -1(已遍历)并加入队列。! r! U- k2 z( ?' {( [
14.如果新的坐标是终点 (8,8),则从队列的尾部开始,回溯找到从终点到起点的路径。% h9 k1 ]. H5 ?- q& n  v8 [* p- j  e! p
15.回溯路径:
) D6 U: J" B1 t% {5 L; y16.如果找到终点,那么从 qe 开始,通过 sq.pre 数组回溯每个点的前一个点,直到回到起点。
( a3 i/ C3 _# j1 o这样,当代码执行完成后,sq.x 和 sq.y 的值将表示从起点到终点的最短路径。
4 V* Z, }( l5 h8 V
) J# {5 R7 W' }+ M4 S2 \: ?$ S# O. Q1 @

广度优先搜索.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-10-13 07:49 , Processed in 0.595140 second(s), 55 queries .

回顶部