QQ登录

只需要一步,快速开始

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

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

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

1188

主题

4

听众

2931

积分

该用户从未签到

跳转到指定楼层
1#
发表于 2023-12-22 15:52 |只看该作者 |倒序浏览
|招呼Ta 关注Ta
clear all
; t! J4 N4 A2 P* ]  B% Dclc$ D8 M$ N, Y3 F9 [! |. N% t- J
maze=[0,0,0,0,0,0,0,0;
. u2 S  `9 B5 }! p& J7 V4 _      0,1,1,1,1,0,1,0;
/ W; i* T1 d& \9 C5 ~; \# Q      0,0,0,0,1,0,1,0;& p/ x: Q) A! u% Q8 o7 a  k3 G9 B
      0,1,0,0,0,0,1,0;, O9 ?+ L- J1 p. Y( j2 c
      0,1,0,1,1,0,1,0;
7 h6 u# S( E; O1 h  Z0 {: j/ P      0,1,0,0,0,0,1,1;( u3 O) U5 d4 j5 {; {' _$ t$ N
      0,1,0,0,1,0,0,0;
8 T" q" V  ?+ l& d( G      0,1,1,1,1,1,1,0];%迷宫:0为路,1为墙,-1为遍历过
6 H# y- T7 W' Dfx(1:4)=[1,-1,0,0];
; z5 }) y7 {% A: Xfy(1:4)=[0,0,-1,1];0 T' H$ K0 E+ X( |7 }
sq.pre=zeros(1,100);sq.x=zeros(1,100);sq.y=zeros(1,100);& I9 L$ j: c- {( S. K
qh=0;%队头指针0 |; b) h" c" v/ Y: Y3 k  ^9 a
qe=1;%队尾指针
8 E% w  u/ A; L' B- b& U* u; u* s+ zmaze(1,1)=-1;
6 ?% B+ R7 m! X" g%第一个元素入队8 O6 k# _: [2 |( I# p2 E- y, B
sq.pre(1)=0;sq.x(1)=1;sq.y(1)=1;# b/ e5 c3 W+ A. ~2 \0 X, q
; h& {$ }$ w: N# N0 |' g  Y
while qh-qe~=0
. B. ]7 |. S& V3 ?7 `qh=qh+1;  L/ R- n/ S, w# Z8 S' Q8 V; Y
bb=0;/ X- p* ~0 c- n! ?
for k=1:4$ }7 l' t! d$ e. U0 {3 i
i=sq.x(qh)+fx(k);
/ W3 J* t' ]6 s9 p: pj=sq.y(qh)+fy(k);7 }& F( A- Q' g
if check(i,j,maze)==1) E. y, `' y1 v1 D; t. G7 y1 K
qe=qe+1;%入队( H3 \% y3 z" i3 r1 F
sq.x(qe)=i;sq.y(qe)=j;sq.pre(qe)=qh;
+ h5 [* N% r; q- s8 a  j' vmaze(i,j)=-1;' J1 w% O7 N3 B/ n
% W! b/ O. c8 M9 Y' y
if i==8&j==8%如果为图最后一个点, u. A8 ]2 G# t! P+ s
while qe~=0/ E; @' y5 R; d4 U+ H7 T* K
sq.x(qe) ! G& X) z  I0 K' n) X; T
sq.y(qe)   
- A+ O! t; f3 L$ L+ q- wqe=sq.pre(qe);
+ R+ Z6 K% ]& W9 e5 I. [end
/ e: y  i7 ?) n+ y' r5 ^: mbb=1;
) `( J7 E( W6 c. s' Ebreak;
5 {3 ?% X! f0 f- \" {; a4 Zend %if
8 X$ t6 x! S* rend %if% |8 V8 W) J2 {: G( P# V
end
$ P5 U" [2 L! X8 Xif bb==1# z0 k9 h: E7 n% \
break. k0 P/ l  I6 d& B* L9 i$ O9 Q
end
( h: s9 A* S+ j* k, M7 ^/ kend%while6 f1 T1 U$ g5 \

) c, Q" F+ q1 W3 Z$ k: J
% @1 z9 j/ C# y$ C5 d这段代码实现了一个广度优先搜索(BFS)算法,用于找到迷宫中从起点 (1,1) 到终点 (8,8) 的最短路径。
! h) x) B8 ]  U/ u& [以下是代码的详细解释:
$ Z" b0 A: h5 d% l/ q4 g( A3 C; m( F1 E$ l2 [8 p4 h
1.迷宫定义:1 p- k3 D) l" F" y( R8 F
2.maze 是一个8x8的矩阵,其中 0 表示可通行的路径,1 表示墙,-1 表示已经遍历过的路径。
& x* C, t0 {9 O3.方向定义:
% M, y$ A9 f0 J4.fx 和 fy 定义了四个方向,即上、下、左、右的偏移量。$ H  a; W7 S8 H# Q
5.队列定义:
0 c/ `6 ~% O- r# O' j% f6.sq.pre, sq.x, sq.y 分别用于存储每个点的前一个点、x坐标和y坐标。
5 [3 I! c; }5 d4 i7.qh 和 qe 分别是队列的头和尾的指针。
, M: C0 G  x4 n9 X0 }: U8.初始设置
% U7 `8 L3 z. W, g; x( a1 h9.起点 (1,1) 被标记为 -1(已遍历),并加入队列。
; @. |4 A8 o+ V) ?6 n/ {) e10.广度优先搜索:
6 Z1 C9 N2 L& {) C  h3 I- r11.使用一个 while 循环来进行搜索,直到队列为空。5 A3 ?0 f6 T5 u& y( t
12.在每一轮中,取出队头的点 (sq.x(qh), sq.y(qh)),然后尝试向四个方向移动。# v$ _& r1 ?# c# d2 b$ S- E
13.对于每个方向,如果新的坐标 (i, j) 是有效的(即在迷宫范围内且没有被遍历过),则将其标记为 -1(已遍历)并加入队列。
- g* J6 A. @2 w, Z$ T2 A+ F14.如果新的坐标是终点 (8,8),则从队列的尾部开始,回溯找到从终点到起点的路径。
+ J  G& b) X) Q% }) {5 t, @; T15.回溯路径:4 p; y; o0 \& i$ X
16.如果找到终点,那么从 qe 开始,通过 sq.pre 数组回溯每个点的前一个点,直到回到起点。
, k2 m( D6 l5 Y# M3 E这样,当代码执行完成后,sq.x 和 sq.y 的值将表示从起点到终点的最短路径。
5 |+ f+ {( [% e6 Y3 x2 m! \) S1 A5 c! Q8 ^  w" [" w7 ]3 ?
, ~9 ]! @, v' J9 W. v5 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-5-26 12:02 , Processed in 0.426611 second(s), 55 queries .

回顶部