数学建模社区-数学中国
标题:
深度优先搜索解决迷宫难题
[打印本页]
作者:
2744557306
时间:
2023-12-22 17:11
标题:
深度优先搜索解决迷宫难题
为大家分享一个代码,该代码是使用升读优先搜索解决迷宫难题
. z7 B# {: o; {1 x$ D4 w8 Z( Z
* N. v7 q2 `0 [
当调用[total,maze]=search(1,1,maze,total);时,会从(1, 1)这个位置开始,在给定的迷宫maze上执行深度优先搜索。下面是对代码的逐行解释:
, O: k, ?( `9 ]
, c) j8 {) G4 F& E/ ?) P# q+ g
1.function [total,maze]=search(i,j,maze,total);
# h2 S& z, R9 \. @
. v9 t, F% S1 O& O& G' Q
/ t3 r- I3 R! N) O& o: b
2.定义了一个函数search,该函数接受当前位置(i, j)、迷宫maze和解的数量total作为输入参数,并返回更新后的total和maze。
; w. S$ I2 u2 d. |$ i& p. o
! [& q1 M9 H1 N5 x9 u! I
{1 @/ B. n. ^. ~" H! K: j
3.fx(1:4)=[0,1,-1,0];
( v: J' o6 I) V8 [
6 S" w+ i. T$ P" c4 n
0 n* W/ P5 L9 J* s2 {% {: c8 k
4.定义了一个包含四个元素的数组fx,表示在行方向上的四个可能的移动。
0 g( k+ T+ x: ~$ X1 U f
+ Q! A3 {' w) n! T
7 q. m! {" p. [
5.fy(1:4)=[1,0,0,-1];
6 Y( q4 j( y7 e: U( c6 F
/ P( N8 n0 N) N+ j: Z
) S5 h! c# S, D
6.定义了一个包含四个元素的数组fy,表示在列方向上的四个可能的移动。
8 d0 ~ e( P6 I
3 k: {8 T( }6 g1 S, m* v, I
( f' u- k$ P1 q1 p$ u( v$ o( D
7.for k=1:4
& `2 [& s! I" @
5 F% K" n) V# s1 _ j
6 T. P5 M/ |! y$ m
8.开始一个循环,遍历四个可能的移动方向。
% q- x% h( o2 A# D0 o9 m* s5 x
# }" d% V3 e# l4 R: F& {
- F" m4 o }" V/ s
9.newi=i+fx(k);
8 O2 B0 a* L& T. }4 H
+ X! u+ b, ^" a. o' _' L
6 q' `* B9 A1 T' S _& n1 G. j6 M
10.根据当前位置(i, j)和移动方向计算新的行坐标newi。
& |$ J7 T. H \% ?- }& x
# c1 j) ^, Z& ?7 m7 m8 @2 a( A6 w
+ G# b8 G! c' A, ?
11.newj=j+fy(k);
' J) R+ E: S; J3 k1 r9 {. s6 i
# T& |/ T# K3 k8 E$ D; X
. O$ r; f( U$ q: F7 B) M, \
12.根据当前位置(i, j)和移动方向计算新的列坐标newj。
1 K# u: t% m- v% K `
0 J; L o/ }5 b$ T
, e" u9 ~- s) P# t1 x0 e3 y
13.if (newi<=8)&(newj<=8)&(newi>=1)&(newj>=1)&maze(newi,newj)==0
& ]# F9 z7 p9 }! N5 M
1 |2 l. r$ {; J' k
7 T3 d7 s$ n8 Y$ [. O
14.检查新的位置(newi, newj)是否在迷宫范围内且是可行的(即迷宫中的值为0,表示可以走)。
4 b: n( d9 I; Y" r( z& k- a' V- m B
( r6 c& U8 q- z9 P* D$ b7 j
; U4 k& @) @6 g
15.maze(newi,newj)=3;
( q/ e" j: \0 {0 W0 J
6 \8 _5 G& G% `/ f* q, a/ z8 q7 D* A
! {( n( y, A, d
16.将迷宫中新的位置标记为3,表示已经走过。
$ ]% @! @( o$ z# {
" ^$ f/ Y+ C. M) r
2 w& s6 _" R$ z) I: W
17.if newi==8&newj==8
1 C% Z% b& A8 p9 L0 Z" M$ t
U# B: j7 q1 v3 \6 F: p; y
3 ~# ? w+ k3 p: `
18.如果新的位置是终点(8, 8),则增加解的数量total,显示当前迷宫maze,并结束递归。
) Y% ~: i, v4 s
, V+ c$ K7 W1 e* Y( ?8 Z& w
7 R' `& B0 n# H- s2 B1 ? U
19.total=total+1
! v5 d" H2 L2 E
3 w$ _1 d" ^ D" }7 s( o. p9 f
20.增加解的数量。
# Y2 c6 X {$ n
21.maze
# F; q; f' ^/ ^$ y, O7 J( L
2 x" r, H( l& H8 E" d$ q
22.显示当前的迷宫状态。
; t( w) \- D, b" ]& y
23.else
" U( v, K( \) B
! R1 y: y0 W3 L3 Z& o& K; `
24.如果新的位置不是终点,执行下面的语句。
, q4 \, o/ B7 U: i; {5 n& T- h& X
25.[total,maze]=search(newi,newj,maze,total);
' S+ X9 v3 l. j! l5 V; |
& K' P9 y5 B5 |5 S
26.递归调用search函数,以新的位置(newi, newj)为起点进行搜索。
3 P& t% ]6 n, h3 x3 A1 z+ M
27.end
9 y1 h. B3 Z u+ ^* C8 Q" i8 X! v
% j$ t4 ]8 L4 c% u9 m1 }
28.结束if语句。
/ p$ {5 W4 B9 T1 @3 o) J, k
29.end
) X# y! r: l5 c+ k: P
2 B( f S0 o9 {: M
30.结束for循环。
3 J+ b/ |4 c) V8 w
31.maze(i,j)=2;
- g3 S+ I3 j8 {& w$ Z
; [+ k6 {9 T4 r3 g
32.如果所有可能的移动都被尝试过,将当前位置标记为2,表示当前路径是死路。
+ I' X( @3 Q; N0 y) E9 j% @7 F
33.end
0 I6 ^# ~! ]' I' H; h/ J
, s8 z% q5 F* b6 A; v: S
34.结束search函数。
l! D0 U9 D: G* U
35.clear all
" E& A( F8 ? }% O ~# y9 N* \
3 a3 x! F& u' R, T
36.清除工作区中的所有变量。
; h% j' d$ p6 }$ w3 o
37.clc
9 B, p- D) m7 s. e
# S7 [1 A5 `# @2 Y
38.清空命令窗口。
' Z8 J. @9 K1 U
39.定义了一个8x8的迷宫maze,其中0表示路,1表示墙。
2 Z0 F, |$ r3 W+ Z7 ?, K* L- _3 Y0 J
40.total=0;
& z% U& a+ p/ q( }4 A# B* L
# X& Q/ z( n+ V* b4 z, O
41.初始化解的数量。
; o- h6 C# i" [& o; W7 H
42.maze(1,1)=3;
) O7 l. {* X% N$ p+ L6 R- G
: T5 l; A# R3 I+ T2 C j+ T+ W! t
43.将起始位置标记为3,表示已经走过。
8 B6 x& z( p: r( B
44.[total,maze]=search(1,1,maze,total);
( B# V5 M: q, N. ]# h7 G, j* N5 k
* k% r5 P; J. W! S
45.调用search函数开始深度优先搜索。
6 c) ?2 {# M' j
5 e2 ], C* R7 N0 [$ o
整个过程是通过递归实现深度优先搜索,尝试从起始位置到达终点,并记录所有可能的解。在搜索过程中,迷宫中的可行路径被标记为3,死路被标记为2。搜索结束后,会显示解的数量和每个解对应的迷宫状态。
# b- U2 B7 x. P" v
, a! b i0 M ]1 G; M
# n j" C0 p: ]2 E, u
8 f% W7 ^, e0 o$ L
5 G$ w( c0 z2 w1 p9 [
0 q* s- m, @7 ]; x4 k
# @3 r" i7 n% ~6 w. \
深度优先搜索.rar
2023-12-22 17:11 上传
点击文件名下载附件
下载积分: 体力 -2 点
637 Bytes, 下载次数: 0, 下载积分: 体力 -2 点
售价:
1 点体力
[
记录
] [
购买
]
欢迎光临 数学建模社区-数学中国 (http://www.madio.net/)
Powered by Discuz! X2.5