QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 2270|回复: 0
打印 上一主题 下一主题

深度优先搜索解决迷宫难题

[复制链接]
字体大小: 正常 放大

1186

主题

4

听众

2922

积分

该用户从未签到

跳转到指定楼层
1#
发表于 2023-12-22 17:11 |只看该作者 |倒序浏览
|招呼Ta 关注Ta
为大家分享一个代码,该代码是使用升读优先搜索解决迷宫难题
) _- v; h7 J, l3 [4 C0 ?4 D# L: d7 J2 c' {) ?! j4 C
当调用[total,maze]=search(1,1,maze,total);时,会从(1, 1)这个位置开始,在给定的迷宫maze上执行深度优先搜索。下面是对代码的逐行解释:, L0 Y3 R% d- m' f5 A9 D2 h& d9 R
' B1 Y$ T$ Z  G4 ]+ @9 f& q9 J
1.function [total,maze]=search(i,j,maze,total);
" q& B7 b+ ]1 ]! T( q3 {" O5 Q9 u) |& x1 V. X$ O1 s( M

0 D& {( \0 H+ r7 r& i2.定义了一个函数search,该函数接受当前位置(i, j)、迷宫maze和解的数量total作为输入参数,并返回更新后的total和maze。' b* [$ F0 p- J9 M- X: X
/ m* a# H6 u, X; I

5 g2 D! x6 K/ _4 [$ u8 p1 J3.fx(1:4)=[0,1,-1,0];4 q9 K  \- F! P4 }+ G3 J
9 }3 ~* T$ A% M' R  S- ~& p
  O( a* d: Y! I
4.定义了一个包含四个元素的数组fx,表示在行方向上的四个可能的移动。) m' T: S1 ^% |6 F3 l3 k5 U
$ p. B  C' j: a- H; `

' M6 N* t/ Z  Q; k+ Q! _4 K5.fy(1:4)=[1,0,0,-1];; j- M( Y: b& S0 Y; f# D, T: p

" N0 B7 _6 Y, x6 m& {) x8 ~$ p  `0 n8 V1 \  U! J, x
6.定义了一个包含四个元素的数组fy,表示在列方向上的四个可能的移动。% S( o4 N; n0 s' e5 Y
' x. N& r, c9 C0 `

" w1 |; I1 Q) x+ S, M0 w7.for k=1:4
7 p5 u8 _/ \- \- F3 c; p
+ [& ~+ U( L1 ?0 `. i: C  @: R; \) H. ^0 k
8.开始一个循环,遍历四个可能的移动方向。  y. h* [2 Z$ d5 o- \

! T  E* q( \1 w+ \3 l4 ]2 r. M, t/ b# s0 {+ K6 M, Q% W, L
9.newi=i+fx(k);9 _9 N5 o/ t1 F% M) Z/ S
" R, t. {: x+ h1 M& x  A4 {: d/ s

2 W& Q$ X* m$ n10.根据当前位置(i, j)和移动方向计算新的行坐标newi。( q# R; L6 M6 H. w" k* J3 L8 {

- p+ x! j4 [6 Q6 w- c
0 v+ S* ]. R5 C$ G, l# m11.newj=j+fy(k);
# p  X* ?; n6 k/ o( m. w' n" t
  `, [/ b# Q7 I% X% E) g) n
12.根据当前位置(i, j)和移动方向计算新的列坐标newj。
5 U8 V8 |# d7 t" [
7 Y: r5 @# I  S2 s$ W6 g( L  E: R1 b
' e9 L5 y$ i# h. \13.if (newi<=8)&(newj<=8)&(newi>=1)&(newj>=1)&maze(newi,newj)==0
- r. t& F: S/ a7 k
3 Z, I: w4 Z! d9 D$ O% V  M; V
  _; @' c0 s$ @4 ^14.检查新的位置(newi, newj)是否在迷宫范围内且是可行的(即迷宫中的值为0,表示可以走)。+ q! y- G1 t. i& k1 k* ~
/ Y2 G3 C6 J0 \( y8 g1 z

2 q7 Y: D. I8 K0 g( M) V# d% W15.maze(newi,newj)=3;
6 {3 H) W8 F- m: _) E" ?$ w! {0 d9 B9 V0 Y9 X

4 V0 K) G1 A" O5 I; j2 M16.将迷宫中新的位置标记为3,表示已经走过。$ D* P& c3 k* |+ w7 j0 I; O

. M1 P; ]) z1 z) G, [, C' V& i1 r
! I$ b% h; k' Q17.if newi==8&newj==8
- }3 r6 @0 e! l8 b+ ], M' ~& @' K, D
& @8 d6 e0 `5 @. L3 p& f* B3 ^/ j2 N
18.如果新的位置是终点(8, 8),则增加解的数量total,显示当前迷宫maze,并结束递归。
" [  J' ^( G" E; n
  Y9 L$ a. U3 n9 \8 _
9 r6 ?1 ~0 I9 b19.total=total+16 A6 F5 ]; O5 G6 h, X. i% F
) e2 e; d# ]9 `, \3 [* t, b2 R
20.增加解的数量。8 k7 N0 I! L! f( d( {
21.maze
( Y4 d9 x$ ]2 b7 ~1 z4 L) X) ^& t- ]$ ]
22.显示当前的迷宫状态。
; R1 L+ Y( s& w8 I23.else% i% r9 a  H& G: m1 ?7 a7 |5 M
- T, p" W  g# i$ [) C/ T3 M
24.如果新的位置不是终点,执行下面的语句。/ {# |! p; H# l1 X0 s
25.[total,maze]=search(newi,newj,maze,total);
7 d7 D) E' M$ m  z6 p
2 ^# J4 k0 O/ @; p2 J26.递归调用search函数,以新的位置(newi, newj)为起点进行搜索。, O# X* Q$ h6 y- w9 }1 w7 A" _
27.end
; R$ N; p% {; Q' I6 _4 B$ ^, i
2 `) a5 P; b2 A. K28.结束if语句。
$ c, q9 O, K! B  N- I3 {29.end
# }" H' \+ y/ g8 h( I0 H# j
* Q2 P. }5 [  g, n) T  o" Q30.结束for循环。& i$ Q% P0 O* @. ~& l$ m, _
31.maze(i,j)=2;' ]$ p: g! C& H5 T1 S

8 o0 g7 L$ A  L0 Q& t. p) R8 G+ E32.如果所有可能的移动都被尝试过,将当前位置标记为2,表示当前路径是死路。' m% w! ]* N7 E; ?! H' n
33.end& }8 ^1 l7 {3 i' `+ p3 d
+ \6 ^* G$ P8 _1 _8 w1 e3 n
34.结束search函数。& k% h, M. m; g, E4 Y
35.clear all7 v. ]  G( b% O* a8 Y8 ]2 S
0 ~0 K5 A% L+ h, L- |; R
36.清除工作区中的所有变量。4 P* S# m! k5 o3 n; h4 a
37.clc0 j( S3 c+ @) `  b. I

, t# G+ E( `8 z2 u7 |38.清空命令窗口。/ P, v: I5 L4 x- \. ]
39.定义了一个8x8的迷宫maze,其中0表示路,1表示墙。4 t1 R1 R2 P8 l& v$ B) a
40.total=0;% a- l( q2 y" _8 E$ ]; O9 z2 H
. j# f, C. R4 P0 C& y1 ?& A' W: h
41.初始化解的数量。
. D  p6 X5 k* W# y! a0 L9 m42.maze(1,1)=3;" W7 D2 T& [3 i" a9 ~

5 ~: r# X6 m+ k  k9 c1 Z43.将起始位置标记为3,表示已经走过。
/ b$ M. O9 t$ r- h0 R# R, A. t44.[total,maze]=search(1,1,maze,total);' {$ l& f  B( Z: x0 @
5 U; w& T: f9 c: U6 U8 v
45.调用search函数开始深度优先搜索。
& a  {$ K) P/ s1 ~2 d
" A3 s5 f$ W5 H" A整个过程是通过递归实现深度优先搜索,尝试从起始位置到达终点,并记录所有可能的解。在搜索过程中,迷宫中的可行路径被标记为3,死路被标记为2。搜索结束后,会显示解的数量和每个解对应的迷宫状态。
2 |+ |- r' u" F$ L* g; H
* w" ?; a: w0 U4 }1 z1 T$ Y5 ?$ G2 u& g4 a: \4 |+ s5 F

! [1 [; Y  @5 J
: {; W( e" f+ H0 M' P* t! b4 {8 g
0 s- M3 n% I  T, |3 i! f4 r9 v4 U2 f# o7 p

深度优先搜索.rar

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

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

zan
转播转播0 分享淘帖0 分享分享0 收藏收藏0 支持支持0 反对反对0 微信微信
您需要登录后才可以回帖 登录 | 注册地址

qq
收缩
  • 电话咨询

  • 04714969085
fastpost

关于我们| 联系我们| 诚征英才| 对外合作| 产品服务| QQ

手机版|Archiver| |繁體中文 手机客户端  

蒙公网安备 15010502000194号

Powered by Discuz! X2.5   © 2001-2013 数学建模网-数学中国 ( 蒙ICP备14002410号-3 蒙BBS备-0002号 )     论坛法律顾问:王兆丰

GMT+8, 2026-4-13 16:52 , Processed in 0.364481 second(s), 54 queries .

回顶部