QQ登录

只需要一步,快速开始

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

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

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

1198

主题

4

听众

2978

积分

该用户从未签到

跳转到指定楼层
1#
发表于 2023-12-22 15:52 |只看该作者 |倒序浏览
|招呼Ta 关注Ta
clear all
; ^! S) P- I5 @9 u. Xclc
% A3 C6 O! _+ l# M9 Lmaze=[0,0,0,0,0,0,0,0;
: m  \6 n: L2 M# S( M5 J5 G      0,1,1,1,1,0,1,0;5 B9 P/ f! p1 U; ?
      0,0,0,0,1,0,1,0;% T$ y/ h  \1 O2 g; ?+ V, |, z
      0,1,0,0,0,0,1,0;
0 R9 R+ P; y6 f      0,1,0,1,1,0,1,0;0 t, T/ ^! c$ N# H# s" `" A
      0,1,0,0,0,0,1,1;! B3 ^/ I4 {8 v+ c% o4 r
      0,1,0,0,1,0,0,0;
0 x( @, O7 @. U$ w# I( X      0,1,1,1,1,1,1,0];%迷宫:0为路,1为墙,-1为遍历过
, Z  ]4 j$ M- j* w; I, [$ [fx(1:4)=[1,-1,0,0];3 ~6 R( l. B, ]
fy(1:4)=[0,0,-1,1];
, B" B6 B8 \( j  p, f  g% Isq.pre=zeros(1,100);sq.x=zeros(1,100);sq.y=zeros(1,100);8 L: @1 B% [# U
qh=0;%队头指针
3 F4 _9 u% w. b$ W( Cqe=1;%队尾指针2 P2 E: O; M9 f1 _. {+ |0 R
maze(1,1)=-1;
  ^! A; v: `1 _( d7 M" S%第一个元素入队& N* b" Q  B2 h1 d! I
sq.pre(1)=0;sq.x(1)=1;sq.y(1)=1;
+ `- Y4 {% i. L8 j9 O, v( p- p" K6 V! ~2 Z: A& P; c
while qh-qe~=0
5 x5 a7 u. _9 C5 m2 Yqh=qh+1;" s; n, Q/ F0 }  M) E9 B
bb=0;
% y# a; G* l) h# \: Q: Ifor k=1:4& e0 R9 d$ m: f, T# o- k9 q9 r# \
i=sq.x(qh)+fx(k);5 q& m, g$ E: K; H0 A5 z& E
j=sq.y(qh)+fy(k);& }8 m5 O, e% `* D( Y! K2 N1 T% t& C
if check(i,j,maze)==1" E% K( e, E; D! v3 Z
qe=qe+1;%入队
. {! ^/ j6 o" u( k! B4 c  jsq.x(qe)=i;sq.y(qe)=j;sq.pre(qe)=qh;+ K3 P6 U, g8 {: x# `% R& Q
maze(i,j)=-1;: ?# J& G+ [& T; j

0 T3 ~( q+ _" d% H" c' Cif i==8&j==8%如果为图最后一个点
, u$ {0 w/ n' Y7 u& g) |while qe~=0" i8 o& X& t8 [- y( ]  P
sq.x(qe) " \4 o1 q  z. U8 {
sq.y(qe)   
1 N$ V: Y9 P" r& C# Sqe=sq.pre(qe);, s& t' x1 V# s3 ]
end
; C/ m  \: ~& @8 E5 i& M' H& Ibb=1;
. q) M" Q1 H& w. b8 o6 P0 s, G" V. Ibreak;5 W+ Y' k# }8 d9 F* E3 W
end %if5 @! t$ c, S" g) q0 u7 ]
end %if" d; U, T3 b6 N& W
end( O: O2 c  ]3 E3 s( c
if bb==1
9 e$ `8 _3 r  Gbreak5 T, W* ~8 B+ q/ _) D
end
1 l! m- V5 R! p/ Fend%while
3 o" Q. Q! `! @$ |+ d/ ?
+ u' X* p! R$ u) f2 i# X8 {$ E8 _8 y% D4 |; u
这段代码实现了一个广度优先搜索(BFS)算法,用于找到迷宫中从起点 (1,1) 到终点 (8,8) 的最短路径。
. B' V7 Y2 k3 H: |以下是代码的详细解释:1 b8 J$ {6 C5 G, d0 s! D3 j

! M! O! K. Y7 F& N1.迷宫定义:2 U2 A6 |+ _4 I$ G. O8 C1 M
2.maze 是一个8x8的矩阵,其中 0 表示可通行的路径,1 表示墙,-1 表示已经遍历过的路径。) o: {: f3 K3 i% R8 K
3.方向定义:
" Q9 Z9 D2 @- l5 c5 h( E% e4.fx 和 fy 定义了四个方向,即上、下、左、右的偏移量。- ?1 S8 A: t/ K' a* J1 H* Y: L
5.队列定义:
; T, q3 x4 Q6 W5 \# B6.sq.pre, sq.x, sq.y 分别用于存储每个点的前一个点、x坐标和y坐标。
+ y) V4 Z+ c4 I; i4 N% h7.qh 和 qe 分别是队列的头和尾的指针。- K% o' `( i7 A6 Z& O2 g: S9 J! E( {
8.初始设置
* Z' @& r5 u: D$ Z; v  W% @9.起点 (1,1) 被标记为 -1(已遍历),并加入队列。! ~' _' M/ t. [+ b0 k6 S( x
10.广度优先搜索:
9 K" @( e& E% Z. w9 a  x3 @11.使用一个 while 循环来进行搜索,直到队列为空。
9 r# h8 C, v( U) c12.在每一轮中,取出队头的点 (sq.x(qh), sq.y(qh)),然后尝试向四个方向移动。
7 G4 _: _$ ]. D9 C" @* H3 I13.对于每个方向,如果新的坐标 (i, j) 是有效的(即在迷宫范围内且没有被遍历过),则将其标记为 -1(已遍历)并加入队列。: E3 B- E" B. C$ p
14.如果新的坐标是终点 (8,8),则从队列的尾部开始,回溯找到从终点到起点的路径。
* M  c5 `  ]$ x5 e( \$ g+ M15.回溯路径:
: V# u6 L/ x3 D1 t5 J5 }6 H# X16.如果找到终点,那么从 qe 开始,通过 sq.pre 数组回溯每个点的前一个点,直到回到起点。4 T4 B- j" \; P8 y6 \
这样,当代码执行完成后,sq.x 和 sq.y 的值将表示从起点到终点的最短路径。
2 h8 h) x9 o& x5 ?/ _2 C/ J$ F
3 `2 o5 F. q1 ~9 g4 P: m: v  K: Y; }7 S. p5 Q# 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, 2026-10-16 08:16 , Processed in 0.398899 second(s), 54 queries .

回顶部