QQ登录

只需要一步,快速开始

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

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

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

1189

主题

4

听众

2934

积分

该用户从未签到

跳转到指定楼层
1#
发表于 2023-12-22 17:11 |只看该作者 |倒序浏览
|招呼Ta 关注Ta
为大家分享一个代码,该代码是使用升读优先搜索解决迷宫难题
7 z; W: `4 c- z: f. x+ E
: ]# Y8 Y; H$ b7 f& Y2 b当调用[total,maze]=search(1,1,maze,total);时,会从(1, 1)这个位置开始,在给定的迷宫maze上执行深度优先搜索。下面是对代码的逐行解释:& K; p; }) S4 |7 c  r
6 C" w5 {6 h, q! e$ v5 O
1.function [total,maze]=search(i,j,maze,total);+ F) n. C6 u6 e

; k% w* {$ n, t" Y" m3 H! G) F2 n! e+ B8 W# R6 o6 N
2.定义了一个函数search,该函数接受当前位置(i, j)、迷宫maze和解的数量total作为输入参数,并返回更新后的total和maze。
: _" I" k8 S; U- ]7 m4 x8 [: g
0 L, ]1 ?. O* X# s& b: g& p( o& Z+ |, V) j7 `! X/ F
3.fx(1:4)=[0,1,-1,0];" y& R( F7 [/ W( [7 ~

0 N7 }  `. R: V: x  A2 _+ A
" N8 X* o* u9 A& H8 W  A% |7 X4.定义了一个包含四个元素的数组fx,表示在行方向上的四个可能的移动。
- T# ^: P- w' O) U0 M) @& a) I, i3 b" x) F5 V
4 j$ l5 ]  h* S, [0 x/ A) y6 H( X
5.fy(1:4)=[1,0,0,-1];4 @8 H, P& s" a3 M. b( E8 ?1 D
9 \1 ^% B% Q6 L! G+ D" q
) f+ z5 b" J! A% D# T
6.定义了一个包含四个元素的数组fy,表示在列方向上的四个可能的移动。5 _$ j) i! ~) @8 l1 v3 w
# ?6 [* z9 p/ G0 d# E+ Q

" a+ B0 |9 O) N, a7.for k=1:41 [% E; L0 D. V

2 U- f- b" [. w6 I
" ^6 Q" x/ @: L" ~6 X8.开始一个循环,遍历四个可能的移动方向。8 }% B) t7 v1 ?3 D2 F5 Y) p( m0 h8 {- I
+ p0 N* U7 ?' C/ N1 z# @
* A& A. ?. F" \( Y' l
9.newi=i+fx(k);. B) P: e* w7 Y. R* o( v3 u2 T1 }0 a

- J5 N. b6 ?! W; M  E5 ~6 `
/ {' h6 k- X2 J6 F/ M10.根据当前位置(i, j)和移动方向计算新的行坐标newi。; C4 e7 z7 D0 B. v4 T: m

5 k. a; B5 l. ?8 t& y6 d1 G, B. e- d3 ~
11.newj=j+fy(k);
) S- o, n  O7 w" W( C5 s" e' c+ x, i5 N

& [% f7 s/ x& g5 z$ @& y( H12.根据当前位置(i, j)和移动方向计算新的列坐标newj。# M! \, I( T  g7 f( ~
0 H) M1 `+ R0 n' o' q
8 u; k! B+ j7 f/ g' N# ?6 z9 C4 L
13.if (newi<=8)&(newj<=8)&(newi>=1)&(newj>=1)&maze(newi,newj)==0' H' Y' C; ]' W6 T+ G% w

' q3 p( W0 T: C) L: R2 U1 u& ]7 `. m) e8 J, F
14.检查新的位置(newi, newj)是否在迷宫范围内且是可行的(即迷宫中的值为0,表示可以走)。- e5 i: ~2 `* f- t
5 i2 H0 Q4 o- v1 z) d4 ]
( x3 \6 E' S. S9 t2 D. p0 X
15.maze(newi,newj)=3;0 \, F. Y) t  |, r" e+ s8 a$ l0 j

! ]: q# E! c! |: b5 S+ K0 A! Q& i1 F7 W" ~+ A' G9 q
16.将迷宫中新的位置标记为3,表示已经走过。' B6 e, O$ S0 H  n( o

% M* T, X( i  x7 W- J+ |
/ C0 R2 @' t' i3 i' B* J17.if newi==8&newj==8; P$ P1 i) H* a0 G& N
0 c& r4 e! C6 {- K6 L; }( W2 `

8 o& Y) C+ S3 w1 \18.如果新的位置是终点(8, 8),则增加解的数量total,显示当前迷宫maze,并结束递归。) ~1 K9 W* ]2 ]) P; o
' w: R, D: @; ?; o7 h

3 g/ `6 i* `- ?$ W, Q19.total=total+14 ]& z& q8 |/ m6 Z6 @: f6 \
9 f% T% G" o3 m$ y+ R' N  B
20.增加解的数量。. O' q5 K6 T2 }: R* r$ _8 H
21.maze4 @& \1 _& U& l0 W% R* H8 F

( [; v! A, |7 D1 ^2 }! y22.显示当前的迷宫状态。
, v( _0 S* R  E% ^9 f. [3 j23.else1 O$ g& o$ R# s4 N* Q7 _  r! t
4 L: n( U1 f2 a5 q
24.如果新的位置不是终点,执行下面的语句。6 s1 H% A% e) Q  u( T+ R
25.[total,maze]=search(newi,newj,maze,total);
2 w, r2 L7 F; v3 G' o6 f: S$ w0 c
26.递归调用search函数,以新的位置(newi, newj)为起点进行搜索。; Y/ N3 x) t& R. P  E
27.end0 I8 k( [7 a% E/ C) @

- n+ X" R/ W% `# s' n: J28.结束if语句。
3 O* K1 C# z# U; U  ]29.end
  |0 ?) U, o: |! x9 w
5 h1 t; v. e& y30.结束for循环。
. |$ O1 e$ ~  M8 r; r( i31.maze(i,j)=2;
2 W$ A1 \# n4 @: X. q. D% Q' |$ R$ I  z% M, _0 I6 I
32.如果所有可能的移动都被尝试过,将当前位置标记为2,表示当前路径是死路。. I( q; q4 ]8 T# w9 A& |
33.end  X" Z( u# F: m. f! O& X9 ^" _1 R* t

  k& A) y& Y8 z/ F34.结束search函数。% {! q/ P. x8 Z: q
35.clear all
4 z& s) j5 b0 R4 m' S! t4 }4 y! o0 c1 b! [! D3 y$ [" [. n3 P0 ?+ b/ f
36.清除工作区中的所有变量。
2 g4 C' k5 e0 Z1 K- i4 @37.clc/ k& k! |9 O( k% z8 x: |
. b6 r) W4 C& U) z% V. X4 x$ f
38.清空命令窗口。, E7 \, s& P$ C% g0 a
39.定义了一个8x8的迷宫maze,其中0表示路,1表示墙。
0 B: q( U# \  T3 x5 ]40.total=0;9 V5 E) t5 r+ u% ?3 i, V
! I; a2 R  D/ _. Q" u/ g) B; I
41.初始化解的数量。4 g$ u9 X7 V$ Z1 D
42.maze(1,1)=3;9 k2 h- C* f! }% G
/ ?: ]  ?' a2 K, p
43.将起始位置标记为3,表示已经走过。, c: d/ x" N8 w) `; X+ V- r- ?' W/ \
44.[total,maze]=search(1,1,maze,total);
  U( O+ ~6 d4 o2 F* j" p/ U
/ \7 B3 ?0 I$ g8 w3 ?8 n45.调用search函数开始深度优先搜索。
  D6 p* _/ D% l
" z8 x2 ^  T; h1 ]整个过程是通过递归实现深度优先搜索,尝试从起始位置到达终点,并记录所有可能的解。在搜索过程中,迷宫中的可行路径被标记为3,死路被标记为2。搜索结束后,会显示解的数量和每个解对应的迷宫状态。
2 M; o+ D$ B- u/ z5 F
0 s- y" T) ^7 a* x( }
0 f! ^0 y$ P. |
* C% Z1 ]) {4 ^& {# b3 Q
2 h% ]% Y$ t, R9 J. \- \; N7 m2 `
$ O+ c& K* N( ~, ]

深度优先搜索.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-8-1 00:23 , Processed in 0.484248 second(s), 55 queries .

回顶部