数学建模社区-数学中国
标题:
深度优先搜索解决迷宫难题
[打印本页]
作者:
2744557306
时间:
2023-12-22 17:11
标题:
深度优先搜索解决迷宫难题
为大家分享一个代码,该代码是使用升读优先搜索解决迷宫难题
( |8 j1 c: I; ~
, x/ f, ^8 [+ R5 H, T3 i# i! {
当调用[total,maze]=search(1,1,maze,total);时,会从(1, 1)这个位置开始,在给定的迷宫maze上执行深度优先搜索。下面是对代码的逐行解释:
: j6 ^2 l% ~# B' o8 @- e1 u9 d
& U& b J1 C; z$ m( G$ E
1.function [total,maze]=search(i,j,maze,total);
' z: |# [0 }- ~; {0 {0 X" K w
7 l! P; G6 F- F, S% V# a
! y- t$ c) G, V) }
2.定义了一个函数search,该函数接受当前位置(i, j)、迷宫maze和解的数量total作为输入参数,并返回更新后的total和maze。
$ r* ?/ T: o0 ?* T$ {' ^+ Y* X
' x5 A% n' t6 [. V9 ^& F/ v; L
Z* v+ q+ Z: ~
3.fx(1:4)=[0,1,-1,0];
9 B# A5 |3 U" z( f0 d
3 ~% R6 @2 q: u4 @
% v5 X9 @$ w6 ?9 `6 J; y
4.定义了一个包含四个元素的数组fx,表示在行方向上的四个可能的移动。
" c3 E: p( n8 B3 f* N0 R
' r7 F9 Q* \- U5 j8 i" G
' l, V. r/ M/ e; T$ ]0 D
5.fy(1:4)=[1,0,0,-1];
9 B% l* ~5 X8 B; I
: Z, F. l# P5 L$ E6 {) u
3 N m) X8 k" m9 \* x& _' n' h
6.定义了一个包含四个元素的数组fy,表示在列方向上的四个可能的移动。
- z, Z0 l$ D7 C- n6 ]$ b
2 `' t; R) y1 p: u4 H0 Y
/ O% O4 B6 D0 Z6 ^3 g
7.for k=1:4
3 }+ p3 `- T8 w" U$ T/ W4 L9 y
6 ~) D. I3 @2 R# r. j4 F/ m! `; X
* ~3 g, G. S4 V2 W: J
8.开始一个循环,遍历四个可能的移动方向。
1 `' K% J! j6 J, D' y; ~, C
' M. Z3 E4 d) ]4 S0 O& z4 T' D
3 {' i# |5 u2 ~; ]
9.newi=i+fx(k);
4 q* K3 o' a# {4 p; y' w) a( o
( o' {# t( K/ C5 ]' i
8 r; h5 ]4 y, ~% S) }4 A% G q
10.根据当前位置(i, j)和移动方向计算新的行坐标newi。
T7 M; R+ R- r$ P6 `
* X9 L( X( \# ?/ ?! e! m& ~6 r
) d6 b$ y/ h- @. D- |
11.newj=j+fy(k);
+ }9 k9 w$ L" n2 C, e2 q' s8 h/ D' W
0 v9 n9 e+ g: z( d' G
; r k6 B1 K8 h2 }7 f4 S: Z
12.根据当前位置(i, j)和移动方向计算新的列坐标newj。
' }, ?9 j7 ]7 d' `
3 Z. u6 H" \5 y) c+ u+ s+ I, h
2 ]5 \! t3 K. q8 \1 h8 I a8 \( b
13.if (newi<=8)&(newj<=8)&(newi>=1)&(newj>=1)&maze(newi,newj)==0
6 `" Q; B- N; c* L% g$ [5 r
: s) r8 ?) E% F3 k9 S- [# i6 ^4 ]
2 n' x5 X) c8 \! N" J* w
14.检查新的位置(newi, newj)是否在迷宫范围内且是可行的(即迷宫中的值为0,表示可以走)。
( t& S6 n! ^+ e: A. G9 P
9 i$ A0 E2 P1 l. \5 x
4 {) N; r7 ]: K: b0 p* f0 N, v
15.maze(newi,newj)=3;
h& Z5 s, {3 U+ z& H# m, D. B
& N# z& }. i7 N0 a4 g! Y5 N, ]0 ^( q
- K+ C* W5 r @; g7 }1 D
16.将迷宫中新的位置标记为3,表示已经走过。
: B/ ^0 Z3 u' P& f
7 v& d5 N# b v k$ m8 K. z
. ?: `! \& l1 j# r5 S
17.if newi==8&newj==8
" ]; {- U c& m& l8 p7 f/ j
- ^* r( ^5 ^2 J& O# R/ h
$ k, c3 P* C8 P# }) O
18.如果新的位置是终点(8, 8),则增加解的数量total,显示当前迷宫maze,并结束递归。
6 v6 s1 D# D k; D% t
. k9 u7 a5 M9 S! X/ L! N, A
`: \, Q! N' C4 d2 u3 A6 N" u
19.total=total+1
6 _9 [' w {5 k ?
" O) m6 }- a* @$ }" u5 Z% |
20.增加解的数量。
. Y% H4 B* _4 \; V
21.maze
" H) G, x/ [8 Q" D$ c( d
; n) l, y0 {4 A6 a
22.显示当前的迷宫状态。
- |; F- j8 ~- T9 i
23.else
* S' ~3 _2 F- K C1 ^* ~3 X
: q2 e7 G6 [& N, q3 `! h
24.如果新的位置不是终点,执行下面的语句。
' V; J! {- B9 f9 V7 K, l. B/ ?& C
25.[total,maze]=search(newi,newj,maze,total);
" }- ^( K4 p! ], k
& p h" `; A- L7 T& W& j3 U
26.递归调用search函数,以新的位置(newi, newj)为起点进行搜索。
% ^+ @9 z+ X2 c( s6 n
27.end
3 X) N. _) o: n. Z3 e" A) S, g
0 I+ X3 A( L( R3 ~
28.结束if语句。
- E( z8 O( [: n2 T
29.end
/ E x, v- X# M- d3 Q4 j
! }8 C3 l1 `4 O) {- u
30.结束for循环。
8 b; x9 K' |( W
31.maze(i,j)=2;
; l4 b) \3 l9 _7 J$ n. x1 v
/ C# w8 W7 o3 ~) l
32.如果所有可能的移动都被尝试过,将当前位置标记为2,表示当前路径是死路。
/ y# Y: ^8 k2 |; K
33.end
# G! w5 d& I6 S7 c0 y
@* o& n& P6 J# X
34.结束search函数。
$ ~2 N+ P0 `* K# U# i. }
35.clear all
5 i4 x' M% n X& J g! ]& w
* F1 E0 y( {; }+ m- A
36.清除工作区中的所有变量。
3 l3 b# U$ O0 a! W
37.clc
% z1 G5 Y' C, C- F6 j2 t
+ d4 |0 N- p1 x& Z1 `) j* C
38.清空命令窗口。
, z; g r9 o8 K% |! C
39.定义了一个8x8的迷宫maze,其中0表示路,1表示墙。
* }7 Q- g) a/ l4 v: `1 u
40.total=0;
6 c- z! \/ W; L6 C
" k! m# _4 [9 m
41.初始化解的数量。
( [- }8 ^% h2 r/ c
42.maze(1,1)=3;
/ U, Q7 R5 T* t9 R
) v3 V& r, q& L7 P" U1 t6 U
43.将起始位置标记为3,表示已经走过。
- G* Z( }$ _8 Q7 }( P
44.[total,maze]=search(1,1,maze,total);
! H" N9 ~- ^% ?9 X% z0 O8 ~
' j; X- ] B1 J2 O" K d# R$ ~ C5 i
45.调用search函数开始深度优先搜索。
$ F" y- S. Y3 J7 g
- _1 I. F" |5 X8 I+ E% ~" u* j! `% w' y
整个过程是通过递归实现深度优先搜索,尝试从起始位置到达终点,并记录所有可能的解。在搜索过程中,迷宫中的可行路径被标记为3,死路被标记为2。搜索结束后,会显示解的数量和每个解对应的迷宫状态。
2 x! V4 }1 _3 T* M v
" J9 p! T, l4 a+ r" v3 A
& @8 Z/ c) d! ^5 ~1 P) l& t
1 C6 i' Q8 o3 \
, K3 q: M6 U9 H+ \; K4 u5 O, F
' `# o5 {7 `2 w2 d, @% S
/ p1 S$ \( Q8 b) q. n v$ N
深度优先搜索.rar
2023-12-22 17:11 上传
点击文件名下载附件
下载积分: 体力 -2 点
637 Bytes, 下载次数: 0, 下载积分: 体力 -2 点
售价:
1 点体力
[
记录
] [
购买
]
欢迎光临 数学建模社区-数学中国 (http://www.madio.net/)
Powered by Discuz! X2.5