QQ登录

只需要一步,快速开始

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

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

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

1171

主题

4

听众

2780

积分

该用户从未签到

跳转到指定楼层
1#
发表于 2023-12-22 15:52 |只看该作者 |正序浏览
|招呼Ta 关注Ta
clear all% b+ E  o; W# q6 s+ S6 k6 r
clc
0 L+ k9 D. n5 v& M; Fmaze=[0,0,0,0,0,0,0,0;
# f# c0 ^1 U9 v4 N( a5 p, Z6 L+ z      0,1,1,1,1,0,1,0;/ U% g+ B" J2 V
      0,0,0,0,1,0,1,0;
+ f" X+ z: `& q* ~7 P6 f% Q      0,1,0,0,0,0,1,0;
/ k9 e, I, \% P) z; ?/ Q      0,1,0,1,1,0,1,0;! s& a" u! d( ~" `
      0,1,0,0,0,0,1,1;
  [  f# x- R# ^0 K6 h* l      0,1,0,0,1,0,0,0;& g+ |# Z% j/ b7 A" W8 ?! ?
      0,1,1,1,1,1,1,0];%迷宫:0为路,1为墙,-1为遍历过
' b+ s+ g( I- t& n5 X# [fx(1:4)=[1,-1,0,0];
% [7 S/ k9 [# D: Z# w, Mfy(1:4)=[0,0,-1,1];; k) H, u/ E6 u  q4 y  F1 t
sq.pre=zeros(1,100);sq.x=zeros(1,100);sq.y=zeros(1,100);8 H, O$ Y4 m# F3 A6 H2 A
qh=0;%队头指针1 f5 w5 h$ `4 B1 @; B" k8 A, r
qe=1;%队尾指针
) h7 M' v, G+ N' Lmaze(1,1)=-1;
" J) r, u' s/ O% B5 \* v%第一个元素入队9 |7 X' x9 ], i7 j) C! I4 I% e
sq.pre(1)=0;sq.x(1)=1;sq.y(1)=1;4 u5 Z5 e$ {+ F6 H

1 ?- ?' N% Z9 e3 a" J1 `while qh-qe~=05 A8 |3 ^8 ~# K
qh=qh+1;
5 c; _' `* F# g/ R; \) fbb=0;
4 |( t! V6 z6 }# F7 m: G- Gfor k=1:46 B: Y$ v' J4 M* t8 L. v: M3 n
i=sq.x(qh)+fx(k);( s7 h0 H% V5 I2 q
j=sq.y(qh)+fy(k);
1 H1 D9 y- m# @. y+ ?: X  T5 Fif check(i,j,maze)==1$ R! _% j0 M3 A
qe=qe+1;%入队  J; ^5 k1 ^! G1 X. O
sq.x(qe)=i;sq.y(qe)=j;sq.pre(qe)=qh;  ~4 {# b' K% Y2 v2 d3 N2 c3 g
maze(i,j)=-1;9 ]0 x- z  C: @6 T" }; v
9 ?7 S* |6 E! J  m* h
if i==8&j==8%如果为图最后一个点
  R) G# K0 g- \; }) w/ F* qwhile qe~=0
+ B/ Q' d6 G3 s+ U' G" U5 \sq.x(qe)
" H1 n! }- ~$ S3 Q7 G; h) ~% V+ Gsq.y(qe)    ! O$ K' {0 Y7 o3 C* R
qe=sq.pre(qe);
; k! s; g( o  e  send
0 S$ e- a5 b, k1 J+ Wbb=1;; p; u# [- z9 |
break;
0 ?' g% T1 M$ x. Bend %if3 N7 ?- t6 Z+ C0 F
end %if, f8 I: L$ Z+ f
end
6 k+ a* w- C+ w# h' L; [if bb==1
  }. l4 r% r9 q- K) A/ O) H2 b2 J+ Lbreak
) V9 y( L9 K! j8 d, t8 Aend
( g7 ~; J* E7 g5 j' l! \/ fend%while
- [" T5 }3 o  m0 D* x7 Z0 |+ V! e* q9 y

- s& J( g# Z3 y这段代码实现了一个广度优先搜索(BFS)算法,用于找到迷宫中从起点 (1,1) 到终点 (8,8) 的最短路径。- w) Z, `3 x5 Y! [
以下是代码的详细解释:+ }' c! g/ g4 g$ Z( T

' i0 x% R, ^8 `4 _3 y9 R) A4 T1.迷宫定义:
& O/ _2 h/ |+ A2.maze 是一个8x8的矩阵,其中 0 表示可通行的路径,1 表示墙,-1 表示已经遍历过的路径。
4 P. s, C! h- Z3.方向定义:
, _& p2 A7 V1 k) }+ e, w- h4.fx 和 fy 定义了四个方向,即上、下、左、右的偏移量。8 m0 H# G' a: B% v7 u8 Y
5.队列定义:, F+ X- S8 U7 K( N# w) a, J/ E
6.sq.pre, sq.x, sq.y 分别用于存储每个点的前一个点、x坐标和y坐标。
. @" _# Y9 R8 T; q+ N' o7.qh 和 qe 分别是队列的头和尾的指针。
" r5 R& c. q( R$ V2 |$ }9 |2 O8.初始设置7 M: l) u. ]& q1 ]; G) r3 F
9.起点 (1,1) 被标记为 -1(已遍历),并加入队列。
* T9 a9 c* O: n7 H10.广度优先搜索:
' N& g( v3 [7 u. I% W/ E11.使用一个 while 循环来进行搜索,直到队列为空。
/ s+ x1 X# S* x+ _12.在每一轮中,取出队头的点 (sq.x(qh), sq.y(qh)),然后尝试向四个方向移动。. ]* k+ V' W( F
13.对于每个方向,如果新的坐标 (i, j) 是有效的(即在迷宫范围内且没有被遍历过),则将其标记为 -1(已遍历)并加入队列。% u- l1 m* R0 F" u& N& Y- y+ h
14.如果新的坐标是终点 (8,8),则从队列的尾部开始,回溯找到从终点到起点的路径。
% N( @9 f- M9 u2 l15.回溯路径:
- E! q; H2 u; C% R, y16.如果找到终点,那么从 qe 开始,通过 sq.pre 数组回溯每个点的前一个点,直到回到起点。
  y9 z/ ]% C. B7 G这样,当代码执行完成后,sq.x 和 sq.y 的值将表示从起点到终点的最短路径。- F& m" M4 S' ^) E
- {; p7 k2 V6 ?2 [  Q
8 D( r' W9 z( \/ a& k

广度优先搜索.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, 2025-6-23 00:04 , Processed in 1.038022 second(s), 55 queries .

回顶部