数学建模社区-数学中国

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

作者: 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 D5.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' h6.定义了一个包含四个元素的数组fy,表示在列方向上的四个可能的移动。- z, Z0 l$ D7 C- n6 ]$ b

2 `' t; R) y1 p: u4 H0 Y
/ O% O4 B6 D0 Z6 ^3 g7.for k=1:43 }+ p3 `- T8 w" U$ T/ W4 L9 y
6 ~) D. I3 @2 R# r. j4 F/ m! `; X

* ~3 g, G. S4 V2 W: J8.开始一个循环,遍历四个可能的移动方向。
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  q10.根据当前位置(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: Z12.根据当前位置(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)==06 `" Q; B- N; c* L% g$ [5 r
: s) r8 ?) E% F3 k9 S- [# i6 ^4 ]

2 n' x5 X) c8 \! N" J* w14.检查新的位置(newi, newj)是否在迷宫范围内且是可行的(即迷宫中的值为0,表示可以走)。
( t& S6 n! ^+ e: A. G9 P
9 i$ A0 E2 P1 l. \5 x4 {) 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 D16.将迷宫中新的位置标记为3,表示已经走过。
: B/ ^0 Z3 u' P& f7 v& d5 N# b  v  k$ m8 K. z

. ?: `! \& l1 j# r5 S17.if newi==8&newj==8
" ]; {- U  c& m& l8 p7 f/ j- ^* r( ^5 ^2 J& O# R/ h

$ k, c3 P* C8 P# }) O18.如果新的位置是终点(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" u19.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 a22.显示当前的迷宫状态。- |; 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 n27.end3 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) {- u30.结束for循环。8 b; x9 K' |( W
31.maze(i,j)=2;
; l4 b) \3 l9 _7 J$ n. x1 v
/ C# w8 W7 o3 ~) l32.如果所有可能的移动都被尝试过,将当前位置标记为2,表示当前路径是死路。
/ y# Y: ^8 k2 |; K33.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- A36.清除工作区中的所有变量。
3 l3 b# U$ O0 a! W37.clc
% z1 G5 Y' C, C- F6 j2 t
+ d4 |0 N- p1 x& Z1 `) j* C38.清空命令窗口。
, z; g  r9 o8 K% |! C39.定义了一个8x8的迷宫maze,其中0表示路,1表示墙。
* }7 Q- g) a/ l4 v: `1 u40.total=0;
6 c- z! \/ W; L6 C
" k! m# _4 [9 m41.初始化解的数量。
( [- }8 ^% h2 r/ c42.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 }( P44.[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& t1 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

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

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






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