- 在线时间
- 477 小时
- 最后登录
- 2025-12-17
- 注册时间
- 2023-7-11
- 听众数
- 4
- 收听数
- 0
- 能力
- 0 分
- 体力
- 7772 点
- 威望
- 0 点
- 阅读权限
- 255
- 积分
- 2916
- 相册
- 0
- 日志
- 0
- 记录
- 0
- 帖子
- 1169
- 主题
- 1184
- 精华
- 0
- 分享
- 0
- 好友
- 1
该用户从未签到
 |
clear all8 N; P1 [" f9 F. E) @% G8 k
clc
% w1 Z$ E+ U+ C2 v2 Tmaze=[0,0,0,0,0,0,0,0;+ }# w# s- H/ L8 L, C
0,1,1,1,1,0,1,0;) c. v& S. o/ F) x
0,0,0,0,1,0,1,0;6 q7 Q9 {3 h9 f0 k, F# o/ {. x
0,1,0,0,0,0,1,0;
9 A) ^! ^, Y7 ?+ e; o 0,1,0,1,1,0,1,0;
, r; t- H. r! _- \2 ]% W 0,1,0,0,0,0,1,1;
" |6 {$ N4 [5 V' v* J$ x 0,1,0,0,1,0,0,0;% D. y* \7 L H7 M
0,1,1,1,1,1,1,0];%迷宫:0为路,1为墙,-1为遍历过
& O1 l( l+ N; T2 l& M' Tfx(1:4)=[1,-1,0,0];
0 D3 N# w6 V" m3 q' i6 Cfy(1:4)=[0,0,-1,1];+ N5 p( T0 |# P- \2 c1 h$ }
sq.pre=zeros(1,100);sq.x=zeros(1,100);sq.y=zeros(1,100);
6 B* P) ]$ U2 t$ zqh=0;%队头指针* B, u0 F9 W8 Q0 T* \
qe=1;%队尾指针: |& }6 @5 D* r# R" C# r, _' G s
maze(1,1)=-1;
# X8 g9 r+ A, ^5 S# e+ y K%第一个元素入队
3 f7 N" V z0 f Osq.pre(1)=0;sq.x(1)=1;sq.y(1)=1;
; A: ]5 F; s" q2 L$ {
: {- ?: i# K' n# r; ~' q7 w( Wwhile qh-qe~=09 b0 b/ A- X1 ?& W6 w7 X+ M3 x8 j
qh=qh+1;
. @+ Q1 m9 n$ Sbb=0;- K* d( O2 A7 b/ d
for k=1:42 R) |4 O+ B7 ^. L2 z
i=sq.x(qh)+fx(k); |' J% \" l+ a
j=sq.y(qh)+fy(k);
. g' K' z7 \2 L oif check(i,j,maze)==1
) w( N% e( y& T" q$ e( O/ xqe=qe+1;%入队
. J. r/ a. {; k+ ksq.x(qe)=i;sq.y(qe)=j;sq.pre(qe)=qh;2 U- L* E; z1 `9 m- p" f
maze(i,j)=-1;+ S2 N4 Y( F, m! m
0 x% L9 T3 h) g
if i==8&j==8%如果为图最后一个点
7 |. \5 ~( u& q: c" q7 \; Dwhile qe~=09 l H s+ _1 J9 `# x, Q9 H* y
sq.x(qe)
- I. y$ }$ u; p( f o- Esq.y(qe)
* M7 }. V* z7 q! d, Eqe=sq.pre(qe);
; G0 |7 [3 T6 L, kend 6 R3 T- Q2 l3 O+ N6 Y
bb=1;
7 Y, K2 W9 S- g9 ubreak;
" N2 u& \% ], `- gend %if; }5 T6 l0 o3 X, C/ Q
end %if
& W n0 ?3 Y6 y$ Z3 \3 qend( y, D1 w# |5 \1 ]9 G0 L4 s5 t
if bb==1
; U- p9 \1 B6 {9 T/ qbreak
, M) Y: t" N& c' a5 |# Nend
% |* L0 _, n' }) Z# E% t. wend%while5 `( i+ a9 Y- Z2 j, |
5 `7 A' y. s. ]# z0 R# }; B0 f& }" m" p! r: c4 e! ^
这段代码实现了一个广度优先搜索(BFS)算法,用于找到迷宫中从起点 (1,1) 到终点 (8,8) 的最短路径。1 y" g0 N2 t; o7 ?2 V
以下是代码的详细解释:
! h( r; f) |! A& m' a1 m3 a6 [6 ]8 f( [
1.迷宫定义:
. F; u# R- d: U/ Y; x2.maze 是一个8x8的矩阵,其中 0 表示可通行的路径,1 表示墙,-1 表示已经遍历过的路径。0 k E" U0 c5 s3 O' {3 z- V6 N
3.方向定义:: Q2 L# i+ M+ F q. K$ m7 w
4.fx 和 fy 定义了四个方向,即上、下、左、右的偏移量。8 V$ g& m8 Z1 v0 d
5.队列定义:1 O3 R; a' l/ d- d- l9 W) [! y. O! u/ O
6.sq.pre, sq.x, sq.y 分别用于存储每个点的前一个点、x坐标和y坐标。
: l7 K! ?/ v8 s2 G$ |# ^7.qh 和 qe 分别是队列的头和尾的指针。" |/ x6 `) F4 J
8.初始设置
) z7 N$ ] n9 ^! ^2 _2 P9.起点 (1,1) 被标记为 -1(已遍历),并加入队列。3 b, ?7 |6 M `9 W& v; ^! e' Y
10.广度优先搜索:
( T' ?7 N7 p/ U, V3 \2 s11.使用一个 while 循环来进行搜索,直到队列为空。
3 S5 m7 D9 c4 N1 y# i# d b8 ?12.在每一轮中,取出队头的点 (sq.x(qh), sq.y(qh)),然后尝试向四个方向移动。1 k8 k+ _( Z1 [6 n/ e) s- B
13.对于每个方向,如果新的坐标 (i, j) 是有效的(即在迷宫范围内且没有被遍历过),则将其标记为 -1(已遍历)并加入队列。
; X K' t! J1 N. S: q14.如果新的坐标是终点 (8,8),则从队列的尾部开始,回溯找到从终点到起点的路径。
& G& ~! t' h& v5 r; r* e15.回溯路径:
$ R: ^. V& g3 ?! {! `; V3 p16.如果找到终点,那么从 qe 开始,通过 sq.pre 数组回溯每个点的前一个点,直到回到起点。 ^0 j) V* _& C' {
这样,当代码执行完成后,sq.x 和 sq.y 的值将表示从起点到终点的最短路径。
- d- m& Q8 t. |8 S1 U+ `
( c/ W5 W! e' j# j# l# K3 J
! W' _4 H. {) I ?& @4 ` |
zan
|