- 在线时间
- 463 小时
- 最后登录
- 2025-6-26
- 注册时间
- 2023-7-11
- 听众数
- 4
- 收听数
- 0
- 能力
- 0 分
- 体力
- 7343 点
- 威望
- 0 点
- 阅读权限
- 255
- 积分
- 2781
- 相册
- 0
- 日志
- 0
- 记录
- 0
- 帖子
- 1156
- 主题
- 1171
- 精华
- 0
- 分享
- 0
- 好友
- 1
该用户从未签到
 |
clear all
! ?$ [$ n/ Y3 h, kclc
3 j6 P* N/ |# R" k3 c: smaze=[0,0,0,0,0,0,0,0;
: l! G$ L/ d+ C' u6 h! q% k" ^! L 0,1,1,1,1,0,1,0;
+ R# @1 n0 e* z& Y1 @ 0,0,0,0,1,0,1,0;! I" e0 c( P8 Y' Z; ]+ `
0,1,0,0,0,0,1,0;
* Y) F' b) f$ \. v" i 0,1,0,1,1,0,1,0;' H/ {% c2 I3 `: Q- Q" O" i- u9 ~
0,1,0,0,0,0,1,1;
3 W0 Y: F- j) x0 J6 z Q, p/ f 0,1,0,0,1,0,0,0;
; {9 K3 s4 C5 L, P, C7 Q 0,1,1,1,1,1,1,0];%迷宫:0为路,1为墙,-1为遍历过* P; z W u8 i8 l: L
fx(1:4)=[1,-1,0,0];0 Q3 w3 K% W- m* m
fy(1:4)=[0,0,-1,1];' b3 g3 f% E8 Q+ @5 `
sq.pre=zeros(1,100);sq.x=zeros(1,100);sq.y=zeros(1,100);$ L; G/ O& h% l' X" [# u4 Y
qh=0;%队头指针1 z0 K2 r# i; ^# h4 W: q* a
qe=1;%队尾指针: k+ \% h3 q) k0 E# T% M' L
maze(1,1)=-1;5 t5 H, [7 e* D, T
%第一个元素入队' u2 |3 O4 \* e% v' ^& @
sq.pre(1)=0;sq.x(1)=1;sq.y(1)=1;! f! N8 |$ w- ~0 b
1 v2 M( G4 I. g
while qh-qe~=0
- W6 k( @ b1 S9 I% [% N7 J; u" lqh=qh+1;
, C: n# G$ i) ybb=0;; o9 @ F2 Q3 s4 ?) C0 [) \2 t
for k=1:4
& }& B# \9 H7 {4 O' e. li=sq.x(qh)+fx(k);/ V5 Y/ l/ _# W1 }6 D, O
j=sq.y(qh)+fy(k);" Q# |: {% ?* Z! ]( Z1 H; X% S' y3 `
if check(i,j,maze)==16 ^8 Q( d/ ^% i
qe=qe+1;%入队
9 l" |8 ~& \/ @sq.x(qe)=i;sq.y(qe)=j;sq.pre(qe)=qh;
5 J' {; N& l3 _% c! N- P. A! \7 y3 Nmaze(i,j)=-1;
9 @; f* Z0 a* h" V# X. M, |$ w" o
; A/ p7 O2 O B! T$ g; P \if i==8&j==8%如果为图最后一个点( }0 {6 B- `3 K0 S/ w8 `
while qe~=07 _% \# Y) T& b% W* S# F
sq.x(qe) * I% _* Y6 u0 `, T0 v4 {9 D
sq.y(qe)
) ]3 Y4 `3 C; ^0 D; T; n+ r$ [! Bqe=sq.pre(qe);
4 Q' Z r% C& d% X6 Hend
5 }# M. T. @/ p' Abb=1;
! z; q' v8 A6 q, m. C+ N# Rbreak;
3 C' I/ i K) }' Fend %if6 T. o+ [5 P: {9 F6 v
end %if+ h/ e4 }, m) ?% e8 p9 |/ q+ x
end
! u8 ]( S" N4 L7 a* ~, n2 [if bb==1
% |, W0 {8 I& W$ S7 B% ]break
4 ?! g6 U. x0 ^( Iend1 Z2 T! ?* R4 K# K# ^- @4 I% K
end%while
7 F- _( \3 T9 ]- b
/ {7 W& [8 h5 F5 b- H
; y) s; C4 w# U. h1 ^3 s这段代码实现了一个广度优先搜索(BFS)算法,用于找到迷宫中从起点 (1,1) 到终点 (8,8) 的最短路径。
/ I, R* _* V; J3 k, r. u: S以下是代码的详细解释:3 G3 l6 D# N4 {5 n5 o
- {. z7 i* r! k
1.迷宫定义:0 x: i5 n, Y; I. j
2.maze 是一个8x8的矩阵,其中 0 表示可通行的路径,1 表示墙,-1 表示已经遍历过的路径。
# ~1 f( ?# i! e% S- R% I2 Z3.方向定义:, j7 |8 |9 O+ k
4.fx 和 fy 定义了四个方向,即上、下、左、右的偏移量。 s5 d% C) _# Z( b/ _4 C
5.队列定义:
' U* `" ^ r, f6.sq.pre, sq.x, sq.y 分别用于存储每个点的前一个点、x坐标和y坐标。! g) B. \/ E1 J% |+ G/ n
7.qh 和 qe 分别是队列的头和尾的指针。
: c, c* P, i& Q+ q8.初始设置5 W) \, o9 V& h1 d" r9 n9 S
9.起点 (1,1) 被标记为 -1(已遍历),并加入队列。
- ~) _. B+ z' {10.广度优先搜索:- P9 @' d" ?7 A
11.使用一个 while 循环来进行搜索,直到队列为空。( _7 ]' Q U: S; Q _) g8 m
12.在每一轮中,取出队头的点 (sq.x(qh), sq.y(qh)),然后尝试向四个方向移动。
" b% a: R2 m4 K J- a+ a1 H13.对于每个方向,如果新的坐标 (i, j) 是有效的(即在迷宫范围内且没有被遍历过),则将其标记为 -1(已遍历)并加入队列。& a3 i R' n" j$ C
14.如果新的坐标是终点 (8,8),则从队列的尾部开始,回溯找到从终点到起点的路径。, F, W! E. R! s" s5 T
15.回溯路径:
# D$ }+ | o) |" k! J16.如果找到终点,那么从 qe 开始,通过 sq.pre 数组回溯每个点的前一个点,直到回到起点。
7 K/ e( e$ i3 e' j4 h' J这样,当代码执行完成后,sq.x 和 sq.y 的值将表示从起点到终点的最短路径。$ z& U) ?, G5 d0 Z% F
8 d: O; i7 y8 m7 X
- T; F4 n% b, P; B2 d/ w# w
|
zan
|