QQ登录

只需要一步,快速开始

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

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

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

1176

主题

4

听众

2884

积分

该用户从未签到

跳转到指定楼层
1#
发表于 2023-12-22 15:52 |只看该作者 |倒序浏览
|招呼Ta 关注Ta
clear all+ ^9 i2 a$ x& P1 X- X+ Z4 D
clc
( |! K" m3 c8 Z2 tmaze=[0,0,0,0,0,0,0,0;
( W  K6 ]- N" X) A" w2 B6 Y( C1 I8 h      0,1,1,1,1,0,1,0;
2 S# P  T; @4 v  n7 f" j      0,0,0,0,1,0,1,0;& E! s5 W, c% o4 R1 p
      0,1,0,0,0,0,1,0;& {9 ~7 b0 C2 @' N/ J
      0,1,0,1,1,0,1,0;8 ]+ G# ]. C' h9 L5 i. O4 u5 c
      0,1,0,0,0,0,1,1;9 G' B* W) X" A; A* w  P' y: e
      0,1,0,0,1,0,0,0;1 w- \; {, \6 o" O. ~0 b" s
      0,1,1,1,1,1,1,0];%迷宫:0为路,1为墙,-1为遍历过7 `; }, e8 a. y0 s2 j3 u
fx(1:4)=[1,-1,0,0];+ r2 ^2 V" _) Y5 B' z
fy(1:4)=[0,0,-1,1];
7 l; {# e7 J$ U% x/ h3 m" s6 usq.pre=zeros(1,100);sq.x=zeros(1,100);sq.y=zeros(1,100);$ `$ b: P( Y; i, }6 [! _
qh=0;%队头指针
& ]1 ~( L# F3 m+ Zqe=1;%队尾指针
+ a/ e* b' |4 G3 v8 I+ Zmaze(1,1)=-1;
( R2 T7 b3 U6 c5 e0 ^( O: p% G; N%第一个元素入队/ H( l9 o) t+ W( |3 ?! J5 P
sq.pre(1)=0;sq.x(1)=1;sq.y(1)=1;  G5 z; Y0 L3 a. S+ i9 X

& O( p3 o. c; ]2 H) c! cwhile qh-qe~=0
; [! k/ R! ]% O6 D9 T5 d. gqh=qh+1;
6 h8 `4 H1 V0 F/ }0 Lbb=0;
  G) L! M# g2 a- X! W8 W  jfor k=1:4
4 N. Q# _, x2 w1 i, }: k5 x0 P7 ai=sq.x(qh)+fx(k);' k4 W* U% c0 V- E0 p; }0 {
j=sq.y(qh)+fy(k);" k+ E# H' j) j, M$ M
if check(i,j,maze)==10 e9 L" @/ A+ O+ |0 q9 ^( a
qe=qe+1;%入队
+ Q" o+ O5 }0 y1 }1 U5 a5 \sq.x(qe)=i;sq.y(qe)=j;sq.pre(qe)=qh;
' }. S0 b( ]5 G- m( X) ymaze(i,j)=-1;
( r) B6 q4 x+ K9 l- F- w* t* ~. r2 H! ]4 g8 n1 E: _. h# S6 B
if i==8&j==8%如果为图最后一个点
4 C) q( y, Q) G4 W2 Lwhile qe~=0. c! B4 k1 ?& T- N0 d! G# K/ c& T
sq.x(qe) , [( o2 k' T. d
sq.y(qe)   
6 Y/ J0 o& [. A. P9 U+ [' @( r# nqe=sq.pre(qe);
. T8 {! i) E, t4 ^7 ^6 K9 W: Xend - {6 `1 R# ?! ]* O8 a: o' z
bb=1;4 e( W* {( ?8 J7 @- D$ |) P
break;. k5 W' b8 U' a+ D7 A" q6 @( V
end %if
  D( M0 V/ L( Lend %if4 S. Y2 d+ Q  P0 @" u
end, R2 ]5 N) d2 A, k/ B3 b; y5 y
if bb==18 {! u4 f: ~4 |) _6 h9 X5 r
break
# y  L, T, [; {  t6 b$ Gend
# z# b/ i9 w( D' X3 Cend%while5 t5 ]9 J* B: A/ M' U; ]) b5 C, |
! h2 Y# s; S2 F* g# L

* N" K" |& @# B0 r这段代码实现了一个广度优先搜索(BFS)算法,用于找到迷宫中从起点 (1,1) 到终点 (8,8) 的最短路径。6 \( }( @9 x1 y7 t
以下是代码的详细解释:
" O) f+ }8 e) l% G& l, Y0 s; P- f/ ~* r( D& U, I' j
1.迷宫定义:! L) B- J1 W2 @8 }. N
2.maze 是一个8x8的矩阵,其中 0 表示可通行的路径,1 表示墙,-1 表示已经遍历过的路径。( @- }# m9 Z- h$ A1 N! Z) y
3.方向定义:
; D; @5 v9 }1 s  j2 e( U4.fx 和 fy 定义了四个方向,即上、下、左、右的偏移量。
* X' _3 E) N' ?) R+ h" H4 G5.队列定义:4 g, ]8 b2 x/ U* R9 ~- P
6.sq.pre, sq.x, sq.y 分别用于存储每个点的前一个点、x坐标和y坐标。
  o4 o7 Y3 Q. i% i9 U+ c- E  s7.qh 和 qe 分别是队列的头和尾的指针。
8 T0 U3 _- _: |; a8.初始设置
9 r1 Z* `2 x* [; j6 l9.起点 (1,1) 被标记为 -1(已遍历),并加入队列。
3 k9 [$ T9 |* v. K: r5 X10.广度优先搜索:
5 H2 d+ W; n6 z8 O  N& `" k. U" n11.使用一个 while 循环来进行搜索,直到队列为空。, T- |7 ~* Z3 j% d. d* m7 u
12.在每一轮中,取出队头的点 (sq.x(qh), sq.y(qh)),然后尝试向四个方向移动。
) d  t  Q. E  o; @13.对于每个方向,如果新的坐标 (i, j) 是有效的(即在迷宫范围内且没有被遍历过),则将其标记为 -1(已遍历)并加入队列。+ |% Y# @+ h3 Q7 r6 h+ a' d
14.如果新的坐标是终点 (8,8),则从队列的尾部开始,回溯找到从终点到起点的路径。
# J* \; i8 \3 G% S15.回溯路径:$ G6 A9 V) F( }8 ^3 i# ~
16.如果找到终点,那么从 qe 开始,通过 sq.pre 数组回溯每个点的前一个点,直到回到起点。
( }! ?8 D0 V3 i这样,当代码执行完成后,sq.x 和 sq.y 的值将表示从起点到终点的最短路径。7 s5 T2 B3 X; n/ G
/ K4 y. }! {# d* [) F5 M- G

/ F' m; N# U5 J% w: n1 ~# F

广度优先搜索.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-9-18 05:32 , Processed in 0.408266 second(s), 54 queries .

回顶部