QQ登录

只需要一步,快速开始

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

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

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

1189

主题

4

听众

2934

积分

该用户从未签到

跳转到指定楼层
1#
发表于 2023-12-22 15:52 |只看该作者 |倒序浏览
|招呼Ta 关注Ta
clear all
* n' {. o( \; @  {# Oclc
4 z0 c# Y5 A8 M, e# z; V, I8 ?maze=[0,0,0,0,0,0,0,0;
0 \+ O/ _: m5 X1 r! Y1 c, |      0,1,1,1,1,0,1,0;5 d( G+ R- |" k* P* X! Y8 c' u0 u
      0,0,0,0,1,0,1,0;( l3 s8 i* K+ L; @3 V
      0,1,0,0,0,0,1,0;* ^; Z' B5 B4 b+ m0 S* \, F
      0,1,0,1,1,0,1,0;
- O2 `4 o" V) y      0,1,0,0,0,0,1,1;
; t" k1 V# j' x' x3 w! e8 p      0,1,0,0,1,0,0,0;
& r; f1 m% w7 k! ~7 [% \      0,1,1,1,1,1,1,0];%迷宫:0为路,1为墙,-1为遍历过
. X3 t4 S! v$ F* zfx(1:4)=[1,-1,0,0];
. Y9 {8 _! S* F; s4 ~fy(1:4)=[0,0,-1,1];
2 }* |/ f" L, v+ |; Nsq.pre=zeros(1,100);sq.x=zeros(1,100);sq.y=zeros(1,100);
1 P3 c% l5 ]& H4 t" L" j& J* o7 S+ ]qh=0;%队头指针
7 R4 v! V  O5 q. b: l6 d" Cqe=1;%队尾指针8 `4 w  |, e. L1 p# k
maze(1,1)=-1;
7 w/ B1 s( {% U3 E* f0 P%第一个元素入队
8 \; V; a% s( D, X9 U6 Z$ Esq.pre(1)=0;sq.x(1)=1;sq.y(1)=1;1 ]9 C1 ^7 O8 C8 e4 ^

2 g4 p: @, n/ J& T1 bwhile qh-qe~=0
5 l8 u, q& ~' a6 n' m$ }8 Dqh=qh+1;
9 c, j0 [% ~8 y+ }: Zbb=0;- J1 _3 B. \3 `3 ^+ t$ i6 h
for k=1:4
5 W/ F7 J' _& ei=sq.x(qh)+fx(k);, |" f% D4 O; D, M1 J# g" k
j=sq.y(qh)+fy(k);
  }9 ]& |8 I9 V+ }* Z+ Hif check(i,j,maze)==1
/ l( c" c- d, t3 ^3 Fqe=qe+1;%入队
3 b# c& }. y' t* p, d* f: N; `sq.x(qe)=i;sq.y(qe)=j;sq.pre(qe)=qh;% u: R* c' M! n, d6 t
maze(i,j)=-1;+ K8 Q9 P; Y7 U6 f7 T
7 u* {. q: E! P, H( F) J
if i==8&j==8%如果为图最后一个点
8 W. W9 H# E5 k5 _while qe~=06 E* M1 Q6 i4 P( u% c
sq.x(qe)
" |* C' _% p+ l; @0 Isq.y(qe)    ! a/ [' K+ f5 s/ U4 M+ E
qe=sq.pre(qe);- y# b# A. j6 j9 q9 w
end . @3 C6 H1 N7 E9 q: W1 D* q. ?# \# S
bb=1;
8 G# L/ \: D+ Q3 gbreak;; {, i3 l) N2 U7 P
end %if
2 V$ K' j( v, {. U) O# mend %if+ g" ^  h# B* G
end- I3 e: H1 H: N+ ]$ s! ~
if bb==1
+ `$ E- O  [  i% Ubreak/ Y' p7 n5 m7 z; i. {
end
3 I3 P7 g' }0 o" A7 T# n+ qend%while$ `; b2 q5 \4 R2 y8 q1 w
% ^- S( ^/ a1 b; P; T5 N
  R) ]0 s) x# i* A' O' d2 C
这段代码实现了一个广度优先搜索(BFS)算法,用于找到迷宫中从起点 (1,1) 到终点 (8,8) 的最短路径。7 }' t! B1 ]$ e. A. W
以下是代码的详细解释:
9 z! i6 u/ X" q/ m8 E! L( l) {1 d: I
1.迷宫定义:
6 D8 D- Q) W, \0 H2.maze 是一个8x8的矩阵,其中 0 表示可通行的路径,1 表示墙,-1 表示已经遍历过的路径。1 q$ `( l5 u# N) I% ]: L
3.方向定义:6 t* u" l0 }4 l' _4 {: x- O: N3 F1 _
4.fx 和 fy 定义了四个方向,即上、下、左、右的偏移量。
/ n  e9 P& d0 b, ^7 j+ J5.队列定义:
( H: }0 Q" M$ k6 L  T4 ]6.sq.pre, sq.x, sq.y 分别用于存储每个点的前一个点、x坐标和y坐标。
9 p3 w5 @$ Q4 _  K7.qh 和 qe 分别是队列的头和尾的指针。. h' s8 S5 G5 I1 `
8.初始设置
- }( {5 O# p  B5 j9.起点 (1,1) 被标记为 -1(已遍历),并加入队列。
& B- B! o$ d' Z( _5 m; i# q! d10.广度优先搜索:
& p1 E3 I" E; t* I4 K' N; o/ H11.使用一个 while 循环来进行搜索,直到队列为空。" R9 }) Z" E9 b# o' A7 V( u
12.在每一轮中,取出队头的点 (sq.x(qh), sq.y(qh)),然后尝试向四个方向移动。; A1 a6 a. O0 j) Q" c: [9 ?
13.对于每个方向,如果新的坐标 (i, j) 是有效的(即在迷宫范围内且没有被遍历过),则将其标记为 -1(已遍历)并加入队列。
* _& @  H1 Z, C. v, u  q14.如果新的坐标是终点 (8,8),则从队列的尾部开始,回溯找到从终点到起点的路径。7 n0 h* l/ v9 \7 K4 u
15.回溯路径:) _) w: ~- `& _- @7 O
16.如果找到终点,那么从 qe 开始,通过 sq.pre 数组回溯每个点的前一个点,直到回到起点。
& x8 j+ P$ p+ q, A: R这样,当代码执行完成后,sq.x 和 sq.y 的值将表示从起点到终点的最短路径。* i2 o0 L! S) L8 c, [4 K) k! D
9 H( C' [' U: G. Z! I- m
1 j. s. f' t; s! v- n

广度优先搜索.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-7-10 02:50 , Processed in 0.496991 second(s), 54 queries .

回顶部