QQ登录

只需要一步,快速开始

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

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

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

1171

主题

4

听众

2778

积分

该用户从未签到

跳转到指定楼层
1#
发表于 2023-12-22 15:52 |只看该作者 |倒序浏览
|招呼Ta 关注Ta
clear all
0 r- q* O( ^& nclc
- c# D$ `! x/ q2 _& @" w$ Lmaze=[0,0,0,0,0,0,0,0;6 e1 y7 K6 ?8 T  U: w
      0,1,1,1,1,0,1,0;
# p2 a9 j7 x! v      0,0,0,0,1,0,1,0;1 m$ x, C% x( r0 J
      0,1,0,0,0,0,1,0;9 N) x+ A5 Y2 B( m
      0,1,0,1,1,0,1,0;1 q) a5 E2 q- e/ S2 t, w% Z4 B
      0,1,0,0,0,0,1,1;4 G: L0 ]2 q+ j7 b, t/ C; @* h
      0,1,0,0,1,0,0,0;
# \$ n6 R/ h+ R% _- z2 n, E      0,1,1,1,1,1,1,0];%迷宫:0为路,1为墙,-1为遍历过' f7 w* Q2 e% s# K
fx(1:4)=[1,-1,0,0];
# f# {) O- L, ^" ^fy(1:4)=[0,0,-1,1];, w% p: f+ v' B/ c: h
sq.pre=zeros(1,100);sq.x=zeros(1,100);sq.y=zeros(1,100);
& M; `4 a( A* z8 r! \. wqh=0;%队头指针! p2 X& {8 o8 J8 _
qe=1;%队尾指针
+ a4 F# t% X4 M% O( u3 ]5 D& pmaze(1,1)=-1;
- \5 J/ ^( f4 ~" h( g2 t# Y# }%第一个元素入队% d) M9 D( k. g9 E
sq.pre(1)=0;sq.x(1)=1;sq.y(1)=1;2 Z8 J! O9 p! G, O% U/ V0 ~
/ n( Q3 t+ h( P& M' R% I5 H
while qh-qe~=0
1 y7 I3 z1 B, x: ]7 B# |* Eqh=qh+1;
4 J$ g3 Q7 V1 G% g9 ?. D( S4 Z. E( c3 mbb=0;
5 P; H' I" b6 K( S4 M- O/ L' vfor k=1:43 }* S% H! v  A
i=sq.x(qh)+fx(k);
( G. G; q. v2 e  r+ r9 sj=sq.y(qh)+fy(k);
. N! f$ \/ L2 c, N. ~3 V( Bif check(i,j,maze)==1- m* d% h( }! d. x: K0 h: V5 v) ~! _8 c
qe=qe+1;%入队6 @) j* O( k4 M  ~
sq.x(qe)=i;sq.y(qe)=j;sq.pre(qe)=qh;- Z7 |. E' L2 u" C
maze(i,j)=-1;! g, Y7 `" f3 v( C. T9 e8 U
/ n5 I# v8 y( ~. M1 p# k
if i==8&j==8%如果为图最后一个点
6 V! N1 |) V: f  B9 @while qe~=0. V# n, n1 k4 G+ ]
sq.x(qe) $ E5 ?6 @5 K* h% |/ y6 t
sq.y(qe)    8 W4 N+ {, k8 M8 f/ a2 s& j' X
qe=sq.pre(qe);
  V; H& ?$ H: f! O# {' B( ^7 g6 Dend 3 f) }) L. _5 M  f! j& h$ [2 x& B
bb=1;
: Z7 q) E( q) E: {4 [4 K- ~5 x4 Vbreak;/ W7 p# V" {$ L1 p- G0 o
end %if& I, G$ ~3 J" i$ v# C1 t
end %if
, ?1 \+ t; v7 }4 X/ E! l8 j4 h, Gend4 h" B6 }5 m1 E
if bb==1
9 n/ ?0 m8 h1 j) i/ `+ ~% C6 P- Bbreak- ^- B/ s+ K$ t0 ?9 }8 R. \
end2 g5 H( [% x$ h+ J" ?6 h' z
end%while
: O% h1 |9 b# }. v. R9 o9 \! M0 ~9 P9 R) d5 m+ O

$ V8 p: {9 a) @8 i这段代码实现了一个广度优先搜索(BFS)算法,用于找到迷宫中从起点 (1,1) 到终点 (8,8) 的最短路径。
& b3 p7 f! v1 m( H7 U! X9 v# f7 y以下是代码的详细解释:$ O5 Y1 j# k3 [4 p( u5 E
$ Y# S% ^8 s( b: f
1.迷宫定义:0 m: u4 |: }0 ~7 g' g2 B
2.maze 是一个8x8的矩阵,其中 0 表示可通行的路径,1 表示墙,-1 表示已经遍历过的路径。
/ R5 k* u  P1 G8 F% z3.方向定义:8 Z* B  n4 H7 H2 s- V
4.fx 和 fy 定义了四个方向,即上、下、左、右的偏移量。
, a  k  s. e* _! u; S5.队列定义:! j2 z9 s; d2 z! w. e& O! y7 N
6.sq.pre, sq.x, sq.y 分别用于存储每个点的前一个点、x坐标和y坐标。' d- d- N/ l6 ^  k3 o  A/ ?  k; M
7.qh 和 qe 分别是队列的头和尾的指针。  i/ n! f! u2 R& Z
8.初始设置6 D7 s7 `6 f2 x0 H: E9 U5 y' T
9.起点 (1,1) 被标记为 -1(已遍历),并加入队列。. w# |( p- o% w' d$ p$ L3 g
10.广度优先搜索:
7 W! l  A* K0 ]11.使用一个 while 循环来进行搜索,直到队列为空。% A' J8 b  P; C0 h9 e* f9 }$ _7 W
12.在每一轮中,取出队头的点 (sq.x(qh), sq.y(qh)),然后尝试向四个方向移动。
7 u' a! ]* T" a- r- z3 v: ^13.对于每个方向,如果新的坐标 (i, j) 是有效的(即在迷宫范围内且没有被遍历过),则将其标记为 -1(已遍历)并加入队列。/ @6 o$ |, A! k" A9 j
14.如果新的坐标是终点 (8,8),则从队列的尾部开始,回溯找到从终点到起点的路径。8 q  g0 l' k: `3 M
15.回溯路径:& y! U' y5 t- n! |1 K+ O
16.如果找到终点,那么从 qe 开始,通过 sq.pre 数组回溯每个点的前一个点,直到回到起点。
8 L8 @, }2 Z3 s3 ?7 Y这样,当代码执行完成后,sq.x 和 sq.y 的值将表示从起点到终点的最短路径。
# q4 t3 G9 v& S$ f
9 K- r$ r8 ^' `/ c
( ~6 V6 F2 A0 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, 2025-6-22 16:16 , Processed in 0.546470 second(s), 54 queries .

回顶部