QQ登录

只需要一步,快速开始

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

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

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

1186

主题

4

听众

2922

积分

该用户从未签到

跳转到指定楼层
1#
发表于 2023-12-22 15:52 |只看该作者 |倒序浏览
|招呼Ta 关注Ta
clear all
7 \, e$ q5 Z" D* Fclc4 I6 G/ `7 L' x1 y
maze=[0,0,0,0,0,0,0,0;
% v  S+ u& a. o3 \1 R      0,1,1,1,1,0,1,0;
  Q. [( |9 I4 F/ A. O& u* e8 Q      0,0,0,0,1,0,1,0;$ Y4 P! r& m6 Y0 e3 u
      0,1,0,0,0,0,1,0;$ W  d8 V1 D' N+ `2 y' t
      0,1,0,1,1,0,1,0;# s! T$ s$ o; O8 \' K/ q; S! V* }  f
      0,1,0,0,0,0,1,1;+ W! i' s& H4 q$ a5 s6 V
      0,1,0,0,1,0,0,0;- {) W4 p% s7 S4 Q( u$ U
      0,1,1,1,1,1,1,0];%迷宫:0为路,1为墙,-1为遍历过* g% \4 x$ R  n8 l
fx(1:4)=[1,-1,0,0];4 ?% c! }$ p+ Q' y, ^
fy(1:4)=[0,0,-1,1];
! i5 \; O* [. T) ?sq.pre=zeros(1,100);sq.x=zeros(1,100);sq.y=zeros(1,100);0 a: q# _/ [2 @3 i+ l+ s( J# y
qh=0;%队头指针
1 n& t% P( j% y+ I9 q5 Bqe=1;%队尾指针3 x7 M6 ^% Y) o# v1 t  E0 f
maze(1,1)=-1;
: p6 h- c# P! N9 |; P2 ]: }%第一个元素入队
5 H, d1 R6 Z  x7 }& {/ }sq.pre(1)=0;sq.x(1)=1;sq.y(1)=1;2 `, K/ S) l# s/ ~- s
; C# p# i( p! G/ [
while qh-qe~=0
, x6 N% |$ ^1 Tqh=qh+1;* n$ j4 y7 @! ]9 n, c
bb=0;
1 S4 ]( x* u$ @/ \4 c, Kfor k=1:4
& l- n; t0 T0 ri=sq.x(qh)+fx(k);& h: d8 z8 R" d8 x- }! ~: n
j=sq.y(qh)+fy(k);
3 |, o( i+ _/ q6 I6 Wif check(i,j,maze)==14 L4 M7 P) S' Y  f' P
qe=qe+1;%入队) k" y9 I% i, m* _: e
sq.x(qe)=i;sq.y(qe)=j;sq.pre(qe)=qh;8 o3 B) l6 w4 \6 b
maze(i,j)=-1;& P: h) {# _8 s% g

" c, H2 D  T  q; W  H6 b9 Yif i==8&j==8%如果为图最后一个点: j5 F" R4 b0 U3 P
while qe~=0
$ R% ]: B2 b+ H, ~+ k7 V  Rsq.x(qe) ; `* ]; O' R* U1 K# z" X2 ?
sq.y(qe)   
; b- i- y& t, d" h9 f. vqe=sq.pre(qe);
, g. y+ Q5 v7 T% ?5 d& Y* ^6 h' w; Rend : X5 E& B/ I- V9 j! ]
bb=1;
: a& R- c* l! _. \8 B+ G1 cbreak;) t* }  X- m' n# `6 @" s
end %if
# I+ J- i+ M7 @) Send %if
' V# K5 x7 F6 Z) o$ s: I, vend) u* h9 c+ o8 E9 [, v5 E5 `
if bb==1
) K2 \  M# }* Vbreak. c3 y7 r/ U/ O$ f  v0 l  X* k
end! b1 R! v9 A% @  t! c" ~+ |
end%while
: k5 z6 [7 T5 r; `) Z* A, d4 z# r  C7 K7 \
( b6 E5 M; T6 k
这段代码实现了一个广度优先搜索(BFS)算法,用于找到迷宫中从起点 (1,1) 到终点 (8,8) 的最短路径。8 |6 s8 O6 d" C4 t( \; H9 S3 l
以下是代码的详细解释:# H/ n  W9 h( U4 @

. \2 t7 |. c& \- Y5 [6 F" g1.迷宫定义:& H" u( D! f5 H2 v/ i- m
2.maze 是一个8x8的矩阵,其中 0 表示可通行的路径,1 表示墙,-1 表示已经遍历过的路径。5 r9 g3 A8 I$ n6 h/ X
3.方向定义:
" N; z5 n8 e! a# ~7 U& n0 u4.fx 和 fy 定义了四个方向,即上、下、左、右的偏移量。
/ m) Q( }% o; {  E% {. B/ E" `5.队列定义:% v$ w, U. D0 g8 l0 J- Q/ B+ z
6.sq.pre, sq.x, sq.y 分别用于存储每个点的前一个点、x坐标和y坐标。
7 b$ \/ ~1 V( V" z/ B. D7.qh 和 qe 分别是队列的头和尾的指针。  S9 O" E6 Z" z8 |0 i
8.初始设置) z) @4 G/ d( t6 J+ V- ?
9.起点 (1,1) 被标记为 -1(已遍历),并加入队列。+ G( B; [+ c; P9 v) m4 _( b; I
10.广度优先搜索:3 s! m  A3 N: ^- o. z$ ]* g- p
11.使用一个 while 循环来进行搜索,直到队列为空。9 I+ u& ?# t  p+ P" u6 H
12.在每一轮中,取出队头的点 (sq.x(qh), sq.y(qh)),然后尝试向四个方向移动。& d9 I. F& C0 _5 b- h0 r
13.对于每个方向,如果新的坐标 (i, j) 是有效的(即在迷宫范围内且没有被遍历过),则将其标记为 -1(已遍历)并加入队列。" Y9 m( A0 b$ ?3 _1 M4 ~& Z# G2 p
14.如果新的坐标是终点 (8,8),则从队列的尾部开始,回溯找到从终点到起点的路径。! Z# z! O! m& P: n
15.回溯路径:
; B8 Q! a7 }3 d: g, {" N16.如果找到终点,那么从 qe 开始,通过 sq.pre 数组回溯每个点的前一个点,直到回到起点。
' E& ~7 b2 V7 E8 P/ w: k6 x3 q这样,当代码执行完成后,sq.x 和 sq.y 的值将表示从起点到终点的最短路径。) g. @' j0 [. q6 \5 n, ~

* h; L9 f3 B4 i) c# W8 d8 y) n5 x0 j7 U( C0 W5 G! ~

广度优先搜索.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-12 07:17 , Processed in 0.556995 second(s), 54 queries .

回顶部