QQ登录

只需要一步,快速开始

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

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

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

1186

主题

4

听众

2922

积分

该用户从未签到

跳转到指定楼层
1#
发表于 2023-12-22 15:52 |只看该作者 |正序浏览
|招呼Ta 关注Ta
clear all
2 L* v0 s: T/ o1 t9 D! i. o: B; f' [clc
) f' |* U% l, F* ]3 G0 `, Gmaze=[0,0,0,0,0,0,0,0;
1 N! f  ^6 F7 z) D8 O! M      0,1,1,1,1,0,1,0;- _7 H* P1 v' h. g- |0 ~( }
      0,0,0,0,1,0,1,0;
/ u1 D# G: ]! [2 d      0,1,0,0,0,0,1,0;
0 P! B" B: n+ ~+ P      0,1,0,1,1,0,1,0;
* f' V! o7 A) g2 _) S" J/ d      0,1,0,0,0,0,1,1;
! f- A2 E( Q6 ?: w3 k0 e4 T# n# n      0,1,0,0,1,0,0,0;/ l7 i1 t  L: E$ `' u/ J
      0,1,1,1,1,1,1,0];%迷宫:0为路,1为墙,-1为遍历过, q4 Y5 A& Z0 X" ]
fx(1:4)=[1,-1,0,0];* k# b/ q- q; M8 o7 O
fy(1:4)=[0,0,-1,1];* \) N* O2 @/ D$ p; ?" D4 ~
sq.pre=zeros(1,100);sq.x=zeros(1,100);sq.y=zeros(1,100);2 t( q( e' B. b* p% p: c, ]6 g; b
qh=0;%队头指针
$ g- ]+ N0 F8 D8 M, r" xqe=1;%队尾指针
( p  j+ B% g! n2 @maze(1,1)=-1;
" ^! q! W$ g5 {%第一个元素入队( f! s* K- [. [
sq.pre(1)=0;sq.x(1)=1;sq.y(1)=1;9 ?& Z9 U) E* l; i

  @5 Z& O4 w) p7 c. ?while qh-qe~=0
: J$ T# t5 a8 G' Jqh=qh+1;+ l) F7 R$ }# W) T. [
bb=0;
' m' [# \( V4 t! f$ E% xfor k=1:4
  U  d+ g& P9 ]# [# P' yi=sq.x(qh)+fx(k);" a9 O2 i: s. J, H# f" O% Q' {$ C
j=sq.y(qh)+fy(k);
& W$ t1 B0 C( D* h8 uif check(i,j,maze)==1
& L8 K$ Z1 m9 ?0 ?! J3 N5 h. Kqe=qe+1;%入队! T5 k; Q- S$ f5 ^
sq.x(qe)=i;sq.y(qe)=j;sq.pre(qe)=qh;' R* s9 e' o- I3 z
maze(i,j)=-1;
" X" r# i: E+ h/ @8 @, t5 y$ ?- ?/ N; k7 c2 x
if i==8&j==8%如果为图最后一个点' q' W! T6 b2 U3 p4 L8 p8 f
while qe~=0& C0 D, T2 a8 y: K, r4 e6 r/ z
sq.x(qe)
9 h0 |0 V+ `7 _) x/ Q2 C* Q- ~sq.y(qe)    ! N8 o3 Z% J: c0 b
qe=sq.pre(qe);) D5 t5 {4 R4 X
end
. h6 d% o" D$ \bb=1;
! @7 B- R+ V7 e8 |break;; ^! E( w; W2 |4 b. {& K/ q
end %if- H$ C6 y$ u' f
end %if
5 y5 }; ~7 W" |6 Hend
: L  w! Z7 Q: U+ |if bb==1
, n; T& C8 o/ ?9 wbreak/ D& p" N- r6 p6 v( V$ Y
end
' t6 f1 O1 Y% \8 L: p! `4 V( dend%while
. x/ t2 U/ i1 p4 g& Q" A. A' p
& a; }5 M8 g  ^! F8 G: ~; P( P1 i2 L3 }. ]
这段代码实现了一个广度优先搜索(BFS)算法,用于找到迷宫中从起点 (1,1) 到终点 (8,8) 的最短路径。
7 s, i, g- j- [4 p0 T以下是代码的详细解释:
' `1 z4 q" }' m' ^9 R6 U
, x  m% ?2 e* z3 }% @- S1.迷宫定义:* S# Y2 {2 y: B3 U
2.maze 是一个8x8的矩阵,其中 0 表示可通行的路径,1 表示墙,-1 表示已经遍历过的路径。( v. v3 i; N$ C5 k0 J
3.方向定义:
) @' H7 W  g, z. f, p9 ?8 Z- J4.fx 和 fy 定义了四个方向,即上、下、左、右的偏移量。# O+ I. `4 H+ x6 g2 X
5.队列定义:
2 [6 g5 p' e& O; [" ~* C3 v1 U1 }6.sq.pre, sq.x, sq.y 分别用于存储每个点的前一个点、x坐标和y坐标。4 P" w( |: e( c) L* u
7.qh 和 qe 分别是队列的头和尾的指针。, O4 ^! R. u$ K: g
8.初始设置! e; M- ^) m1 X3 |
9.起点 (1,1) 被标记为 -1(已遍历),并加入队列。: S5 T7 ?2 k6 m* I% @
10.广度优先搜索:' G1 Y6 x. ^# \9 i5 W
11.使用一个 while 循环来进行搜索,直到队列为空。$ s8 t+ v1 H! S8 `' Z. V, t3 z/ o
12.在每一轮中,取出队头的点 (sq.x(qh), sq.y(qh)),然后尝试向四个方向移动。
7 ~/ Q7 K( R8 C8 y5 a" D13.对于每个方向,如果新的坐标 (i, j) 是有效的(即在迷宫范围内且没有被遍历过),则将其标记为 -1(已遍历)并加入队列。
$ Z# `/ V8 F: ^$ Q14.如果新的坐标是终点 (8,8),则从队列的尾部开始,回溯找到从终点到起点的路径。
- w. H4 ?, X! H15.回溯路径:
2 u# n! D& n" t2 B& `16.如果找到终点,那么从 qe 开始,通过 sq.pre 数组回溯每个点的前一个点,直到回到起点。* Q9 M; u! _5 G! j9 i
这样,当代码执行完成后,sq.x 和 sq.y 的值将表示从起点到终点的最短路径。& d0 s" T4 \1 U- C

8 S; N7 e; I1 X* [, e8 ^9 ?' W) h) t' o  M9 l, \

广度优先搜索.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-4-16 00:17 , Processed in 0.436420 second(s), 56 queries .

回顶部