QQ登录

只需要一步,快速开始

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

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

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

1198

主题

4

听众

2978

积分

该用户从未签到

跳转到指定楼层
1#
发表于 2023-12-22 15:52 |只看该作者 |倒序浏览
|招呼Ta 关注Ta
clear all$ f2 k# }! X% f+ i
clc
5 J1 |9 P8 J$ @: m! T5 Hmaze=[0,0,0,0,0,0,0,0;
9 T* t' ~# R8 V2 y9 v* |      0,1,1,1,1,0,1,0;
3 x; Z  U* e( U4 d, t3 K      0,0,0,0,1,0,1,0;
' g  ~9 U. s" O4 x      0,1,0,0,0,0,1,0;
) v4 P) U9 O6 }" Q+ z3 {$ |      0,1,0,1,1,0,1,0;+ b4 A2 h5 a" P2 [% U6 D
      0,1,0,0,0,0,1,1;9 k, S; n, k: X8 s
      0,1,0,0,1,0,0,0;
3 L9 K1 L& c: h6 Q+ `      0,1,1,1,1,1,1,0];%迷宫:0为路,1为墙,-1为遍历过
" e+ c7 V6 x  A7 A7 G( G. Tfx(1:4)=[1,-1,0,0];+ J( r. Z$ i& B& G. @+ L! {
fy(1:4)=[0,0,-1,1];
+ S: s* q9 G9 K6 asq.pre=zeros(1,100);sq.x=zeros(1,100);sq.y=zeros(1,100);* y1 T0 X4 X) y0 [: s
qh=0;%队头指针# r- ^+ ]+ c' u6 D2 n- h( |
qe=1;%队尾指针
9 L% |" C6 h( M8 G# z/ c  a1 omaze(1,1)=-1;
' z1 g9 ]2 b( H  x%第一个元素入队- m2 W' l. ?, q% B) ]5 W- ~4 J
sq.pre(1)=0;sq.x(1)=1;sq.y(1)=1;/ m3 \8 C: i) o* N( P
  i0 z! D$ Y. [
while qh-qe~=0
% k. |) ]% b5 A7 Z& {" ^1 c: Sqh=qh+1;
4 m  C- a  R# W9 ]) `2 D6 H( t# lbb=0;
% s/ b; P& F6 E* }- W6 jfor k=1:4
6 l' u4 B0 ~( s, {4 V( B, Ii=sq.x(qh)+fx(k);
8 p) @; N$ {3 K+ w3 f+ xj=sq.y(qh)+fy(k);2 q7 h/ \0 V" A
if check(i,j,maze)==1& Y- J/ W5 Z: v* c
qe=qe+1;%入队$ f& {; c2 y: J* L5 B( ]
sq.x(qe)=i;sq.y(qe)=j;sq.pre(qe)=qh;
' e( E2 B/ A# Gmaze(i,j)=-1;. L; G3 K8 M- l+ b$ r
! @8 R6 {3 ~1 x" U  i3 n
if i==8&j==8%如果为图最后一个点: z- ~$ `0 Y( `1 }: I
while qe~=0" \# o  h8 ]' |9 N
sq.x(qe)
8 U( y# o! a9 Ssq.y(qe)    & D( M; k; [+ m4 h+ t  {- a
qe=sq.pre(qe);$ Z- b5 m" H0 I% s( B
end
6 ]' d$ k  \! ]1 F* c7 abb=1;
( `- [" g/ {+ o( L6 [break;* D( S8 Z5 L# k1 V
end %if6 a3 i4 j7 D0 e% S
end %if
8 F5 K/ K+ E. b7 ~& oend. g1 p4 d) F& }4 ^  i( h( V3 U
if bb==1
9 f& _% w) K. Y) B6 k- C5 ^% T: lbreak
+ N# I* J# I/ ^# b- j0 g" qend  l  ^8 H% V; f4 y7 |
end%while
6 `4 S) ?' U% n9 X8 r7 B, `+ j2 Z8 t4 P( U2 e' y

7 L1 q( E3 U- }  b' k这段代码实现了一个广度优先搜索(BFS)算法,用于找到迷宫中从起点 (1,1) 到终点 (8,8) 的最短路径。
1 p( Z1 j/ ]. F  n) ^9 A以下是代码的详细解释:) c1 Z3 T: \6 A* Q

3 h# t2 N, K) j; N; N1.迷宫定义:' J/ H, }1 |, G( \/ U/ G& j$ w
2.maze 是一个8x8的矩阵,其中 0 表示可通行的路径,1 表示墙,-1 表示已经遍历过的路径。8 c  j! D2 e: Q" i
3.方向定义:
/ N6 f6 E" j  N# w4.fx 和 fy 定义了四个方向,即上、下、左、右的偏移量。
3 B1 R2 @. b" v5.队列定义:8 G% o) p7 \" W& _, O: v0 a% |! ~
6.sq.pre, sq.x, sq.y 分别用于存储每个点的前一个点、x坐标和y坐标。
) g- c; Q' U! V# p7.qh 和 qe 分别是队列的头和尾的指针。; ]3 ~3 N4 h0 j  o2 s0 _" H
8.初始设置2 P. @- ?+ ?! e' q3 d
9.起点 (1,1) 被标记为 -1(已遍历),并加入队列。
. N% ?" h" o1 U- L0 c4 e! V10.广度优先搜索:
1 i7 u9 N+ ^4 y8 S2 V( k. v, C7 A11.使用一个 while 循环来进行搜索,直到队列为空。
$ Q0 A( [2 n; |8 q( ~0 {12.在每一轮中,取出队头的点 (sq.x(qh), sq.y(qh)),然后尝试向四个方向移动。  [) B7 r6 z1 J
13.对于每个方向,如果新的坐标 (i, j) 是有效的(即在迷宫范围内且没有被遍历过),则将其标记为 -1(已遍历)并加入队列。
7 H0 A4 ^( G3 @3 U' r8 B" @14.如果新的坐标是终点 (8,8),则从队列的尾部开始,回溯找到从终点到起点的路径。
( Z$ N0 o/ j% _8 B+ O3 T7 n, o15.回溯路径:1 z/ D  Y% O2 z+ `, g$ W2 r
16.如果找到终点,那么从 qe 开始,通过 sq.pre 数组回溯每个点的前一个点,直到回到起点。
7 c: ?( n: r- w: n9 Q1 F3 T这样,当代码执行完成后,sq.x 和 sq.y 的值将表示从起点到终点的最短路径。
8 ^; _' \: _1 _+ Y5 {5 x4 |/ ?. e* o6 l7 J! G6 S
9 P% D. C) K- _! ~3 ]* y

广度优先搜索.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-15 09:30 , Processed in 1.770010 second(s), 55 queries .

回顶部