- 在线时间
- 479 小时
- 最后登录
- 2026-4-13
- 注册时间
- 2023-7-11
- 听众数
- 4
- 收听数
- 0
- 能力
- 0 分
- 体力
- 7789 点
- 威望
- 0 点
- 阅读权限
- 255
- 积分
- 2922
- 相册
- 0
- 日志
- 0
- 记录
- 0
- 帖子
- 1171
- 主题
- 1186
- 精华
- 0
- 分享
- 0
- 好友
- 1
该用户从未签到
 |
clear all4 p/ a8 p0 F; E s; P; h; M
clc' n- N9 S- U2 Z/ r9 d. L- G
maze=[0,0,0,0,0,0,0,0;
" x( C9 D+ X. f% G% i# x9 q 0,1,1,1,1,0,1,0;
1 }, A. y: \5 I- [ x6 l+ I" j 0,0,0,0,1,0,1,0;6 e! }2 v7 |. E# s0 I6 q% U
0,1,0,0,0,0,1,0;" u* ~7 T1 H$ i, X( @! V2 |" r
0,1,0,1,1,0,1,0;( M3 J3 N8 J$ H1 M2 ?
0,1,0,0,0,0,1,1;
} F6 E+ e. |$ \ 0,1,0,0,1,0,0,0;
: j% `' Z5 [, u 0,1,1,1,1,1,1,0];%迷宫:0为路,1为墙,-1为遍历过% Q. t, d7 b2 W; Y i
fx(1:4)=[1,-1,0,0];# T1 d: a1 z$ h1 W- B
fy(1:4)=[0,0,-1,1];( o& [+ N8 \ l$ v' s6 o# g
sq.pre=zeros(1,100);sq.x=zeros(1,100);sq.y=zeros(1,100);, E- y* Q; ^) |9 V
qh=0;%队头指针8 I# Z: T9 i) v
qe=1;%队尾指针
1 ^0 Y H7 o2 ?* ymaze(1,1)=-1;& O6 S" g+ t, y5 a
%第一个元素入队$ L' U: E; r/ R( P7 T
sq.pre(1)=0;sq.x(1)=1;sq.y(1)=1;, q4 I3 O% j4 `6 X! b; T2 y+ @
1 j" |# K8 @, U4 c+ E
while qh-qe~=0- T; C" w- j" b# R
qh=qh+1; O; n1 F+ m9 u' D9 z' _3 g
bb=0;
/ N( ]8 c1 o, X2 [for k=1:4$ T8 a) y" ^; C4 S9 i c0 ~7 k1 E
i=sq.x(qh)+fx(k);
' H# P, O7 M9 c+ Fj=sq.y(qh)+fy(k);* A8 | Y6 F1 }7 A0 K
if check(i,j,maze)==1. e4 L' A, p- M6 l
qe=qe+1;%入队5 G2 U3 l) m' k# W1 O, l; f
sq.x(qe)=i;sq.y(qe)=j;sq.pre(qe)=qh;
% H/ v# s, y7 Q. B' imaze(i,j)=-1;: }4 h$ F/ [; o6 f1 z& }, ~
p/ B e# c$ [if i==8&j==8%如果为图最后一个点
" _: d1 A/ b: \+ D. twhile qe~=0
! F: m# k: t3 Wsq.x(qe)
/ e) O8 N& b u6 r" hsq.y(qe) & K% e$ u! \- i! l
qe=sq.pre(qe);- {! f& w: ~; j5 v8 ?+ ~2 o! v% L$ `
end
1 w4 U9 `1 Z" E$ ]* i" lbb=1;
, I- \! m( g+ l1 E& Jbreak;) ^) R/ s) Z* Q! ^: S
end %if
: |1 g+ y: S2 g6 v o5 D2 J* ^end %if
# c, b. k6 d: ]4 C+ ~ aend9 `' W: _' B3 C$ K& Z% w
if bb==1
# B' b2 {6 y2 \- n [break
9 ], c5 I/ _( L6 n/ l, Oend
* Y8 H+ c s6 @$ r( P$ J Qend%while
0 Z$ v4 [8 p6 q( H8 c/ t7 [7 Z! K z3 f* ~) F
+ l5 p8 Y0 {5 K% B
这段代码实现了一个广度优先搜索(BFS)算法,用于找到迷宫中从起点 (1,1) 到终点 (8,8) 的最短路径。
9 O8 s2 l5 i) ~4 S% o6 W9 T以下是代码的详细解释:
% F) w4 `, Z+ s; I6 Q( Y9 M6 ~5 I# U0 c. t8 q W( z8 Z
1.迷宫定义: a' K; ~3 j1 j( d6 _ V+ `( S: g
2.maze 是一个8x8的矩阵,其中 0 表示可通行的路径,1 表示墙,-1 表示已经遍历过的路径。! G! e% @1 i0 Y2 A9 H) T
3.方向定义:
2 c8 \: [7 s3 X% ]8 S! n. b4.fx 和 fy 定义了四个方向,即上、下、左、右的偏移量。
! [+ n6 b( @+ }1 P5.队列定义:8 y, ^ o# ?- q; i# O- e/ C& V0 L
6.sq.pre, sq.x, sq.y 分别用于存储每个点的前一个点、x坐标和y坐标。
4 K$ J, @! I; X$ |. G. C) J' B7.qh 和 qe 分别是队列的头和尾的指针。
* x8 {: H- C; E1 H; t8.初始设置! X& g# a8 C5 s% c' g2 q) [
9.起点 (1,1) 被标记为 -1(已遍历),并加入队列。
- w' V9 Z+ H2 I8 I6 |; g9 }10.广度优先搜索:- m( c2 y5 H3 ?, {/ a5 ]
11.使用一个 while 循环来进行搜索,直到队列为空。
C$ e8 i# m/ F9 F12.在每一轮中,取出队头的点 (sq.x(qh), sq.y(qh)),然后尝试向四个方向移动。- v3 k/ w) z6 s- [3 B
13.对于每个方向,如果新的坐标 (i, j) 是有效的(即在迷宫范围内且没有被遍历过),则将其标记为 -1(已遍历)并加入队列。
, z5 P# K2 v" v6 u ^14.如果新的坐标是终点 (8,8),则从队列的尾部开始,回溯找到从终点到起点的路径。
/ \& h7 ~# m5 [2 T8 U5 U15.回溯路径:& j8 _$ m9 @/ w5 b0 a& b. b% C
16.如果找到终点,那么从 qe 开始,通过 sq.pre 数组回溯每个点的前一个点,直到回到起点。
" _' g# |0 K% T; J+ C) {5 u这样,当代码执行完成后,sq.x 和 sq.y 的值将表示从起点到终点的最短路径。$ L4 c ]0 D7 w8 a! {' {9 h5 x" f
3 o( z$ q& @- r+ @
: c+ T7 b& J6 a- j& ~+ Q/ u1 k& z
|
zan
|