QQ登录

只需要一步,快速开始

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

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

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

1189

主题

4

听众

2934

积分

该用户从未签到

跳转到指定楼层
1#
发表于 2023-12-22 17:11 |只看该作者 |正序浏览
|招呼Ta 关注Ta
为大家分享一个代码,该代码是使用升读优先搜索解决迷宫难题8 D# ]" k# P( Z
) X% q& e6 A, E' Y
当调用[total,maze]=search(1,1,maze,total);时,会从(1, 1)这个位置开始,在给定的迷宫maze上执行深度优先搜索。下面是对代码的逐行解释:' ]4 J" |, W  E+ H

5 M& D1 \; w: f4 L! b# K1.function [total,maze]=search(i,j,maze,total);# [" P: K( a: t
3 D  j7 w4 e) |7 C, ^- F
' r& s" H% t; A. @) |- u
2.定义了一个函数search,该函数接受当前位置(i, j)、迷宫maze和解的数量total作为输入参数,并返回更新后的total和maze。
* a1 o+ c5 ], }+ [; t0 ~8 @9 A. r$ L) c6 P* E; y; g

: B! A" d8 C; z. R0 x: ]3.fx(1:4)=[0,1,-1,0];
; t3 x! g; J4 e) M# n' {  b1 W% ?( x2 i0 v# o. A' v) [4 }
  X. O% b  d  e
4.定义了一个包含四个元素的数组fx,表示在行方向上的四个可能的移动。% F0 E, {/ s1 a' c
0 w0 E6 g" U; H" T
0 ?& r/ }6 C8 t/ m0 w
5.fy(1:4)=[1,0,0,-1];* e, m. L2 Q6 `9 s$ N7 m1 l
- l8 ~, |# i8 c+ d

2 d; t! _, l( n: W/ k0 m6.定义了一个包含四个元素的数组fy,表示在列方向上的四个可能的移动。1 O6 ^; E5 b  J/ A( e

+ x, ]4 i2 j. |  `  ]2 d3 a
7 N. J( X7 a. ~8 E8 l# d8 a% v7 X/ c; [6 J7.for k=1:4
0 f7 O1 D: M( B0 b- y0 q* [0 _* Y
' O4 q# \' |- A  v5 t; t
' j/ f, \3 r. n5 U5 @& _# J  f8.开始一个循环,遍历四个可能的移动方向。
' f! h3 V, a( j0 D5 s& P, R* i( {
; f" _4 R; o( L8 X1 G) Z
* l7 [5 ~' Y4 `; q9 G9 k9.newi=i+fx(k);! X- k: E" Z2 w8 h6 u' Q- l/ ]. u
7 W# d* j7 H8 c! d, L! t6 \3 w/ i  R
; L1 d, q& ^9 {6 J
10.根据当前位置(i, j)和移动方向计算新的行坐标newi。# H. C0 e- g% X/ G. k

9 [6 g% X7 t" I' j( e
) l- w: m& ^' P) g11.newj=j+fy(k);
* g( U: k5 c- b% }
: R) e( _" O: r+ N8 n4 [* ^
# C; s* \; C" ~12.根据当前位置(i, j)和移动方向计算新的列坐标newj。
: u; B/ u- M( ^& `
2 J3 X* X/ L) r& r
1 U- o: ~: `2 t4 f13.if (newi<=8)&(newj<=8)&(newi>=1)&(newj>=1)&maze(newi,newj)==0
$ V8 M; b  L! [% |1 f1 O
5 }+ Y1 M$ s! _& f' A
5 P% R# b3 `2 U* z/ f! p/ |& s3 s! W14.检查新的位置(newi, newj)是否在迷宫范围内且是可行的(即迷宫中的值为0,表示可以走)。
4 Z; i( Y# C' ~; m8 Q% c
/ h' K( K) `5 W+ _, j/ V: f& O# g+ f+ r- y- W
15.maze(newi,newj)=3;
$ o. ^+ ~. k9 z  Y, T- @# v3 m9 g+ ]7 r

# ?  Z% h# h  [( R, Y# i16.将迷宫中新的位置标记为3,表示已经走过。
6 S6 D& w% P" ?  k) k- Z1 W/ ~6 ]' k2 Q' ?1 q7 O( c) Q
% z9 ]& r/ h9 X  B& j6 f* P/ L
17.if newi==8&newj==8
& j9 I9 i6 \2 a$ y+ h) k  O0 f, @) ~% Q" x; t. R# Y9 }" Z% Z- V4 h

8 A  M+ L5 p% M& a) Z9 t18.如果新的位置是终点(8, 8),则增加解的数量total,显示当前迷宫maze,并结束递归。/ v7 ?1 d4 F% g: g2 I: x5 G; R* E

- j) _7 f5 H4 |9 ]
4 r* |! c0 [% C: g19.total=total+1
% t6 |  d! h5 Q* }+ U4 {+ L, A# F6 z' I' M
20.增加解的数量。  ?4 y8 m( L8 a3 F1 \$ ~' y
21.maze- S" c) [' y. Z5 p5 V

4 V5 p" V/ a. y" g5 X2 o" |2 T  H22.显示当前的迷宫状态。
7 E# [3 c" \4 _$ ]4 H3 t23.else5 t" j8 S( _& x; D* z
+ ]6 G' q/ _$ F) |" o$ _
24.如果新的位置不是终点,执行下面的语句。# m2 {" p3 P" Z, ]) A$ C% p! P
25.[total,maze]=search(newi,newj,maze,total);
1 ]9 e7 }( I8 N9 V  k0 C* A+ I' z: u" E6 R4 ]# T7 t
26.递归调用search函数,以新的位置(newi, newj)为起点进行搜索。
- \( ?5 U, g4 |27.end
' g' M% A5 B$ Z: n6 B8 G/ N; k# h; i
28.结束if语句。
" l# m! T; s( G& p! w4 c$ Y29.end
  g; }* V* U; x6 L: g5 f" k* Q+ Y1 o: O. _1 y
30.结束for循环。
# L! G" B; A' S31.maze(i,j)=2;- m1 [3 c4 d+ G1 b. N' U8 I6 P

5 b" c3 m; ~& _9 X/ k3 K% ^32.如果所有可能的移动都被尝试过,将当前位置标记为2,表示当前路径是死路。
$ C% ]7 t( ^- i9 x0 X* L33.end1 F8 k( H. o6 R, W2 H9 j9 E
; `  z; p0 R* g3 \- O& _2 u
34.结束search函数。
1 r  e8 q  s! @3 T3 Z4 g35.clear all* J5 Z( l$ U0 C. _' j- W
$ [0 m7 B: {$ a( g9 y
36.清除工作区中的所有变量。+ h# P2 i; o4 z- v9 S9 k: j8 H
37.clc* q5 v, v5 H# ?( F9 M; [1 t
5 C, f1 y2 e2 R* Y7 i, e
38.清空命令窗口。9 X2 W7 B8 Q- v# A
39.定义了一个8x8的迷宫maze,其中0表示路,1表示墙。1 F7 O" ~* l) h; r
40.total=0;
3 |; s" a7 v" f2 e, A; W% j$ I, s. X% {& g
41.初始化解的数量。
, k1 z3 X; K2 }) R$ S42.maze(1,1)=3;% e9 r" d! g# N  G9 H! _
4 j" f( p2 O9 D7 t/ U
43.将起始位置标记为3,表示已经走过。
& X! A% W+ p. r/ }1 k3 y44.[total,maze]=search(1,1,maze,total);
. n5 v% _9 r4 t3 t! Y
2 i& a. q7 K) C, i; M5 t& y45.调用search函数开始深度优先搜索。
. Q5 v' Y# W% v3 j; o
& ^5 K2 e7 L7 ^" T% \整个过程是通过递归实现深度优先搜索,尝试从起始位置到达终点,并记录所有可能的解。在搜索过程中,迷宫中的可行路径被标记为3,死路被标记为2。搜索结束后,会显示解的数量和每个解对应的迷宫状态。
4 H9 Z# p: F  x$ W. P- R, k2 }) Z, T, y9 x
/ |/ k* X( n7 u, C2 |5 ~
% N6 s" U" h; w, P; `9 V, F

. F( P% d$ u  O" x# Z5 R3 s  u& y1 o4 b2 U2 R; _7 w6 m" p
" V4 i) l9 I: A$ h

深度优先搜索.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-6-11 11:58 , Processed in 0.447642 second(s), 56 queries .

回顶部