数学建模社区-数学中国

标题: 深度优先搜索解决迷宫难题 [打印本页]

作者: 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: b2.定义了一个函数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: j3.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 k4.定义了一个包含四个元素的数组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( D7.for k=1:4& `2 [& s! I" @

5 F% K" n) V# s1 _  j
6 T. P5 M/ |! y$ m8.开始一个循环,遍历四个可能的移动方向。% q- x% h( o2 A# D0 o9 m* s5 x

# }" d% V3 e# l4 R: F& {
- F" m4 o  }" V/ s9.newi=i+fx(k);
8 O2 B0 a* L& T. }4 H
+ X! u+ b, ^" a. o' _' L6 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 y13.if (newi<=8)&(newj<=8)&(newi>=1)&(newj>=1)&maze(newi,newj)==0
& ]# F9 z7 p9 }! N5 M
1 |2 l. r$ {; J' k7 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 g15.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: W17.if newi==8&newj==81 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 ?  U19.total=total+1
! v5 d" H2 L2 E
3 w$ _1 d" ^  D" }7 s( o. p9 f20.增加解的数量。# Y2 c6 X  {$ n
21.maze# F; q; f' ^/ ^$ y, O7 J( L

2 x" r, H( l& H8 E" d$ q22.显示当前的迷宫状态。
; t( w) \- D, b" ]& y23.else" U( v, K( \) B
! R1 y: y0 W3 L3 Z& o& K; `
24.如果新的位置不是终点,执行下面的语句。
, q4 \, o/ B7 U: i; {5 n& T- h& X25.[total,maze]=search(newi,newj,maze,total);
' S+ X9 v3 l. j! l5 V; |
& K' P9 y5 B5 |5 S26.递归调用search函数,以新的位置(newi, newj)为起点进行搜索。
3 P& t% ]6 n, h3 x3 A1 z+ M27.end9 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, k29.end
) X# y! r: l5 c+ k: P
2 B( f  S0 o9 {: M30.结束for循环。3 J+ b/ |4 c) V8 w
31.maze(i,j)=2;
- g3 S+ I3 j8 {& w$ Z
; [+ k6 {9 T4 r3 g32.如果所有可能的移动都被尝试过,将当前位置标记为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: S34.结束search函数。
  l! D0 U9 D: G* U35.clear all
" E& A( F8 ?  }% O  ~# y9 N* \
3 a3 x! F& u' R, T36.清除工作区中的所有变量。; h% j' d$ p6 }$ w3 o
37.clc9 B, p- D) m7 s. e
# S7 [1 A5 `# @2 Y
38.清空命令窗口。
' Z8 J. @9 K1 U39.定义了一个8x8的迷宫maze,其中0表示路,1表示墙。
2 Z0 F, |$ r3 W+ Z7 ?, K* L- _3 Y0 J40.total=0;& z% U& a+ p/ q( }4 A# B* L

# X& Q/ z( n+ V* b4 z, O41.初始化解的数量。
; o- h6 C# i" [& o; W7 H42.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' j5 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

637 Bytes, 下载次数: 0, 下载积分: 体力 -2 点

售价: 1 点体力  [记录]  [购买]






欢迎光临 数学建模社区-数学中国 (http://www.madio.net/) Powered by Discuz! X2.5