QQ登录

只需要一步,快速开始

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

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

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

1198

主题

4

听众

2976

积分

该用户从未签到

跳转到指定楼层
1#
发表于 2023-12-22 15:52 |只看该作者 |倒序浏览
|招呼Ta 关注Ta
clear all+ J; p" |4 F2 a- M# x4 `5 ]
clc
' ^, I& p$ o- n. s( \$ e6 i9 Q# B( qmaze=[0,0,0,0,0,0,0,0;& a* [! M1 A: ?4 L
      0,1,1,1,1,0,1,0;0 H4 {8 g& ~8 t4 J
      0,0,0,0,1,0,1,0;
8 R+ k* U" n6 P+ G5 p, k      0,1,0,0,0,0,1,0;
4 f5 ~/ b. |( f      0,1,0,1,1,0,1,0;# f8 [) a3 T$ R9 Q- G
      0,1,0,0,0,0,1,1;
' w! g% t% u& Z6 ^! l) ]      0,1,0,0,1,0,0,0;0 F1 R1 ^1 S0 s7 |7 |3 L& _( h
      0,1,1,1,1,1,1,0];%迷宫:0为路,1为墙,-1为遍历过
' _+ h2 B! N. e8 g0 o+ p: mfx(1:4)=[1,-1,0,0];0 l- B( G& W4 Y/ ]7 I
fy(1:4)=[0,0,-1,1];
9 S- G' l* Y1 u8 N7 d+ D- p2 msq.pre=zeros(1,100);sq.x=zeros(1,100);sq.y=zeros(1,100);
& U2 z! [6 H% a! Z$ Oqh=0;%队头指针
1 H: u! Z+ y: N4 U! r9 {qe=1;%队尾指针, z' ~& t% h4 m7 a# d6 P* g
maze(1,1)=-1;. R' x( N9 n6 V  M
%第一个元素入队  o! v) Q. I, D& X0 F1 q
sq.pre(1)=0;sq.x(1)=1;sq.y(1)=1;# `) w* t) q6 `0 _* l
; r) G% r5 t9 p8 [6 B) [
while qh-qe~=0
+ b' I' q( S, D8 c7 T5 s: Lqh=qh+1;! Y* b  l3 F" |* X
bb=0;
' @7 }2 E( n2 |. E% |for k=1:4
; @0 L( o9 X7 X  `i=sq.x(qh)+fx(k);
' [8 E( x, c- j: {# f# A# pj=sq.y(qh)+fy(k);% ?$ [1 e. n, u8 F/ x* u
if check(i,j,maze)==1
# S8 o4 E: j# g- D7 c7 jqe=qe+1;%入队$ U7 J, G$ }  V) T! [4 d
sq.x(qe)=i;sq.y(qe)=j;sq.pre(qe)=qh;9 Z* n- h6 s5 l6 b! }- j
maze(i,j)=-1;
0 ~. g+ A% }- ^% |, z2 @/ N4 O) f4 A& t6 U: ?6 A4 P* O% b
if i==8&j==8%如果为图最后一个点
5 W- P& r# g- Y+ f! xwhile qe~=0
2 f8 p3 B9 H( z1 ?' }2 Qsq.x(qe)
$ |: N* p- m* v) z, Fsq.y(qe)    % Y* m- N3 j- r5 E
qe=sq.pre(qe);
7 G- Y+ o$ n; X3 S6 W# O) bend & C5 X- L. w: z$ X$ {$ x" G' c
bb=1;
; U: j+ T' I# [- P; `9 N: d, n+ B1 [break;# O1 j8 e) G7 W. r# D
end %if
5 C, j8 R0 w  Vend %if: U. u3 e' e! R8 U$ s, h$ S
end
% e$ H3 r9 l" ^if bb==1  V. l( D9 ~+ J$ c9 L
break1 z' ]/ S  Z/ y; L6 F7 ?, T) e, o* G
end
% k1 i. _  @9 rend%while' D: p, H$ g2 z5 m+ C+ g  n0 `4 s$ P# q

8 q5 i2 Z  v8 U4 \, F) Y0 J, V' U( ~+ E, L7 [' w5 y. j# C  T5 H
这段代码实现了一个广度优先搜索(BFS)算法,用于找到迷宫中从起点 (1,1) 到终点 (8,8) 的最短路径。
' v8 i' C; K) t% N5 x4 t$ N以下是代码的详细解释:
% d. t& N; u; v5 ?$ n2 m" X* P# ~4 q! O1 E
1.迷宫定义:
% _9 w# P6 R0 U6 @) q2.maze 是一个8x8的矩阵,其中 0 表示可通行的路径,1 表示墙,-1 表示已经遍历过的路径。
0 P& O/ \% m" B9 ^$ E; [$ w; S4 [3.方向定义:5 J! t8 |' A6 O6 y2 I
4.fx 和 fy 定义了四个方向,即上、下、左、右的偏移量。, e; g4 M/ S" `7 W; A2 O+ O1 E
5.队列定义:+ v* k4 ^" b) Q! m* c* C" i" W9 \- D
6.sq.pre, sq.x, sq.y 分别用于存储每个点的前一个点、x坐标和y坐标。9 `& }6 Q0 ]8 q
7.qh 和 qe 分别是队列的头和尾的指针。
" F8 n8 ]9 ?& F$ S3 h& F8.初始设置. A/ w7 K0 F5 r# |# \
9.起点 (1,1) 被标记为 -1(已遍历),并加入队列。
9 e. |) c, n" q! d2 j10.广度优先搜索:. V0 p' N+ `' `& d
11.使用一个 while 循环来进行搜索,直到队列为空。* c2 y3 p1 s8 P/ X7 h
12.在每一轮中,取出队头的点 (sq.x(qh), sq.y(qh)),然后尝试向四个方向移动。( u8 W3 X9 h8 ]8 t: g! I" w
13.对于每个方向,如果新的坐标 (i, j) 是有效的(即在迷宫范围内且没有被遍历过),则将其标记为 -1(已遍历)并加入队列。' k( Y, Z2 X, W. y  l
14.如果新的坐标是终点 (8,8),则从队列的尾部开始,回溯找到从终点到起点的路径。
6 Q/ i  A' z1 U5 z- K& n2 \1 n15.回溯路径:
/ o$ M* M3 e5 i" }$ z) v, I% m16.如果找到终点,那么从 qe 开始,通过 sq.pre 数组回溯每个点的前一个点,直到回到起点。( C  Q" @/ U) Z2 B
这样,当代码执行完成后,sq.x 和 sq.y 的值将表示从起点到终点的最短路径。
  Y! l9 U; a% f0 U
  b$ R* U$ L6 d1 V
, N5 @! 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, 2026-9-13 15:08 , Processed in 0.453791 second(s), 54 queries .

回顶部