- 在线时间
- 480 小时
- 最后登录
- 2026-6-1
- 注册时间
- 2023-7-11
- 听众数
- 4
- 收听数
- 0
- 能力
- 0 分
- 体力
- 7823 点
- 威望
- 0 点
- 阅读权限
- 255
- 积分
- 2934
- 相册
- 0
- 日志
- 0
- 记录
- 0
- 帖子
- 1174
- 主题
- 1189
- 精华
- 0
- 分享
- 0
- 好友
- 1
该用户从未签到
 |
clear all2 `/ w/ L( J4 o3 w
clc
7 j# Q* j. e$ q" }# r6 }: Kmaze=[0,0,0,0,0,0,0,0;
. c1 G& y& r4 ~' P 0,1,1,1,1,0,1,0;* r1 H/ [. f+ J& k7 U; M5 T
0,0,0,0,1,0,1,0;! D2 w" j/ Z" C6 F- H B: f9 m8 b: H
0,1,0,0,0,0,1,0;3 B4 k" W n5 X6 e! L, @+ e
0,1,0,1,1,0,1,0;
7 s" K& q8 @+ z0 n 0,1,0,0,0,0,1,1;
" i# C) ?. x, P: z, K9 \0 z2 A 0,1,0,0,1,0,0,0;. u: x2 o% I. K/ J- A
0,1,1,1,1,1,1,0];%迷宫:0为路,1为墙,-1为遍历过
& K8 }0 z, j6 Rfx(1:4)=[1,-1,0,0];
# Y" ?7 v: r7 I- D( a' ?$ k1 _. @fy(1:4)=[0,0,-1,1];' J! e- n8 f/ x: F9 C$ I
sq.pre=zeros(1,100);sq.x=zeros(1,100);sq.y=zeros(1,100);* L) E4 K! ]& e7 u7 f) G$ X6 {
qh=0;%队头指针% Z" z H0 x. E" O; ]. v9 [
qe=1;%队尾指针" J. H$ `- Y/ K2 Z7 c
maze(1,1)=-1;
2 }. d1 Q3 N( p+ }- O6 {%第一个元素入队+ o$ `5 d7 u$ ~' o* z# z. U
sq.pre(1)=0;sq.x(1)=1;sq.y(1)=1;% j: T) J" A4 P/ [
& H, t: w m* Y/ [
while qh-qe~=0
; B3 t: t+ o4 n0 k" ]+ k: Yqh=qh+1;1 U+ F! P8 X$ G0 k7 |3 ^
bb=0;
4 L2 Y/ m/ U$ @for k=1:43 y8 b9 \' G0 B( y; k
i=sq.x(qh)+fx(k);7 e% ]9 m& S) p- O8 m" r2 L% u
j=sq.y(qh)+fy(k);
, B0 b( D+ @2 a3 {9 W9 \+ bif check(i,j,maze)==1- I4 L2 y% j) F
qe=qe+1;%入队
* C" {: o; t& X$ Zsq.x(qe)=i;sq.y(qe)=j;sq.pre(qe)=qh;) d4 J, c) \) }+ r# {- v( A
maze(i,j)=-1;
* P9 T3 c. A1 f/ b, \! d# q6 G
5 J L( p6 d0 q' i0 G( Q9 N; w' Rif i==8&j==8%如果为图最后一个点
( i& W8 [0 n! w6 t' Iwhile qe~=0$ [7 W1 n5 H; |4 W3 `$ j
sq.x(qe)
/ g8 c: S% u) ]4 Gsq.y(qe)
( ~0 M8 g2 T. T8 k/ k# `- Iqe=sq.pre(qe);1 U) |$ a6 }; O- o# u4 s9 D
end , f0 e7 N9 n* X7 h# x* O. D& A
bb=1;! |& U9 g8 M' m7 m+ r3 w6 B
break;
! x* ^/ a. D1 x0 O, t e) h4 lend %if
6 R; e% D- S3 \1 g. [) t' ^end %if( C' A2 T& d# v7 v. U" [" S8 ]
end2 e4 ^$ O9 D0 T
if bb==1! X* @& `1 \& p# X$ v
break
; x1 }+ c7 \/ b' lend; o- h# ^7 W) h2 Y1 n
end%while
* q _& a0 S! [, l7 l0 N/ }! \$ @0 K2 K, S9 T; n
( D8 g8 b8 v& Q- q4 m6 ~
这段代码实现了一个广度优先搜索(BFS)算法,用于找到迷宫中从起点 (1,1) 到终点 (8,8) 的最短路径。9 p$ [1 n8 g% w R% X$ M
以下是代码的详细解释:$ U$ D V& j2 ]" E8 M0 g
+ x! ^) j$ c# Z# t* s* q" ~
1.迷宫定义:
; P, G. f; z7 B+ n5 R2.maze 是一个8x8的矩阵,其中 0 表示可通行的路径,1 表示墙,-1 表示已经遍历过的路径。
) l8 |3 d) [0 N3 U% G* f3.方向定义:
) O1 ~9 d1 C; W% h9 j4.fx 和 fy 定义了四个方向,即上、下、左、右的偏移量。! T8 t. \: n3 g# i W
5.队列定义:
) j7 p4 `( O8 t6.sq.pre, sq.x, sq.y 分别用于存储每个点的前一个点、x坐标和y坐标。
# p0 l) C% p' v3 \0 m7.qh 和 qe 分别是队列的头和尾的指针。2 T( m% e# h& p* f& F
8.初始设置
8 [1 P; ?. S3 M+ j1 ^! u4 }9.起点 (1,1) 被标记为 -1(已遍历),并加入队列。
( |3 `" `# C/ j; s' S, K) S10.广度优先搜索:% [/ v) {8 R, g9 c% f8 M& M
11.使用一个 while 循环来进行搜索,直到队列为空。
! s1 _9 X+ C$ ^$ w: Q+ Z6 l) o8 q* B7 q12.在每一轮中,取出队头的点 (sq.x(qh), sq.y(qh)),然后尝试向四个方向移动。& Z* n) Y7 p( G; C) |
13.对于每个方向,如果新的坐标 (i, j) 是有效的(即在迷宫范围内且没有被遍历过),则将其标记为 -1(已遍历)并加入队列。
$ {* J6 R+ {( Z5 l. Z" J8 c H2 T14.如果新的坐标是终点 (8,8),则从队列的尾部开始,回溯找到从终点到起点的路径。
1 b. @# @& |7 k( C) J8 m0 i15.回溯路径:/ B8 L5 A' Z) F+ n. T, l
16.如果找到终点,那么从 qe 开始,通过 sq.pre 数组回溯每个点的前一个点,直到回到起点。
. B7 y3 n( ~/ ^* m. N这样,当代码执行完成后,sq.x 和 sq.y 的值将表示从起点到终点的最短路径。9 ?4 x! U+ i* {% V s
8 l! Y! A6 ]- Z5 _6 D+ T2 g& F9 E, R% y
|
zan
|