QQ登录

只需要一步,快速开始

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

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

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

1189

主题

4

听众

2934

积分

该用户从未签到

跳转到指定楼层
1#
发表于 2023-12-22 17:11 |只看该作者 |倒序浏览
|招呼Ta 关注Ta
为大家分享一个代码,该代码是使用升读优先搜索解决迷宫难题$ ^2 |: @6 `9 h* ?

" o: Y. L: x$ _/ Y& p/ d; l. ]0 n当调用[total,maze]=search(1,1,maze,total);时,会从(1, 1)这个位置开始,在给定的迷宫maze上执行深度优先搜索。下面是对代码的逐行解释:
# z, p8 b# A5 \. v
! x& U9 r) M! G% t1.function [total,maze]=search(i,j,maze,total);: \! r; \4 T0 Y8 y3 w4 y
9 a& L) e8 l2 Z2 Y9 B

, L  _1 A8 y) `/ A* X" c2.定义了一个函数search,该函数接受当前位置(i, j)、迷宫maze和解的数量total作为输入参数,并返回更新后的total和maze。
, V# O7 X. w7 Y" A1 f$ `
' W4 K: @0 }  \, J" b+ g. B7 z" _( z0 b/ o3 G: z
3.fx(1:4)=[0,1,-1,0];
% n* ]' W; y7 x$ d! Z1 O
6 u1 q% x1 X! @/ v/ P4 D. h+ k# g7 Z1 U$ {
4.定义了一个包含四个元素的数组fx,表示在行方向上的四个可能的移动。
9 S( T, b' t- n9 h+ J5 B; J1 s# ]) R- i' G) w: W+ D

8 ^* u+ z& U) O% P4 S1 y" Q. i* ]5.fy(1:4)=[1,0,0,-1];
' j! V" R; ^; \3 W; a# @9 Y! O9 ^2 ^8 ^

) n# ^" Y/ m  P1 ]  ^1 \, V6.定义了一个包含四个元素的数组fy,表示在列方向上的四个可能的移动。
+ v3 i6 O: g: `! l7 [; V: \
9 [, O: X( m3 R, v# \
5 s/ Y2 a0 a# c! V) n; P2 H0 B5 g7.for k=1:4: H) z2 {7 [$ `& f$ H  r9 Y; G

9 o2 {) e, q( m5 k& I" L& h7 p
$ g* |* ~4 o2 h4 l8.开始一个循环,遍历四个可能的移动方向。6 Y) l9 P% [% w6 }3 m" {

2 O" R3 N1 u% Y' s4 g  h' M: s: v
9.newi=i+fx(k);& d% v- n7 X" \( d
- h" V% m& Q1 A0 O' \5 C" p
2 R( ]% B& R3 q3 a
10.根据当前位置(i, j)和移动方向计算新的行坐标newi。# a3 _* b+ D1 G. P5 c# i
& I- [3 m3 r8 [- G8 F% f3 L

. l6 F- }( U' `* D' H* d11.newj=j+fy(k);2 [1 t4 Z+ X2 f. c' D- z% x+ R

" Q- r5 \3 i6 n
- J* D+ t4 Q/ D4 U# W4 x12.根据当前位置(i, j)和移动方向计算新的列坐标newj。+ h" K) d* v6 [" _  s% D4 ~4 C, |

& z5 X3 G  @2 D, J9 L. N2 `7 f; j' m' l% b
13.if (newi<=8)&(newj<=8)&(newi>=1)&(newj>=1)&maze(newi,newj)==0- G, _" e$ |/ b7 p& ?# M
, N  h; f+ [1 c. W( i1 z

2 t7 H+ N+ ]- [! ?' v14.检查新的位置(newi, newj)是否在迷宫范围内且是可行的(即迷宫中的值为0,表示可以走)。/ B% ^' b  E) s- k5 u# {3 e
9 p- }- C- X3 l

2 c# H8 r1 t; @6 D15.maze(newi,newj)=3;
6 X: s% n6 y5 r/ K1 L& j0 O9 }2 u' l  ^7 d/ ]" u
" f, H4 H! M2 E' ]% x" x
16.将迷宫中新的位置标记为3,表示已经走过。. }; H+ U$ \# v! {
, R0 R7 @  P% m. A2 [, a! q
) H/ ]6 C2 [- X+ R% X! K" [" \
17.if newi==8&newj==8
% o+ U2 _3 |9 ?  Z* f) U8 H
* d8 ]5 l3 c) E4 F; q
" Y* ~$ {8 u* `- ^9 Q9 w& V% V18.如果新的位置是终点(8, 8),则增加解的数量total,显示当前迷宫maze,并结束递归。) W9 `. r) Z# }# d
9 H0 [; K, G3 `( [

* P' e! U- k1 c4 y" a% L) @% E19.total=total+18 ~' g  `" X- n3 G5 a1 Q5 k

* [4 b* x0 i% I  h0 |% O9 @20.增加解的数量。  U/ c2 W: \9 w  J5 I, A
21.maze
6 e+ O, x! V; ^( M" V  \+ p  v2 P" t, v2 R5 J* r! n
22.显示当前的迷宫状态。
0 r7 `# t4 s7 t' X% L8 T8 w1 X23.else7 K" R8 R+ s* }$ f2 A

) [, A# l) g9 m% `6 h. ~: ^24.如果新的位置不是终点,执行下面的语句。/ i' i2 P) G2 d* D6 l, R' w  C) u* B
25.[total,maze]=search(newi,newj,maze,total);( J3 n8 g( y& W% U2 ]
7 B6 Q5 A0 k0 P7 Q  q
26.递归调用search函数,以新的位置(newi, newj)为起点进行搜索。
6 M# ^( G3 O: h6 }4 b+ J27.end/ `8 |7 `" L* B) f
. M6 I. n3 [3 k! }( @
28.结束if语句。
9 ~# E; B8 M3 {1 s29.end. F+ T* i( k+ [+ L5 m* r2 H+ H* ~4 j; u

' W$ b! Z" k9 }  U2 X% y& V! Q30.结束for循环。
2 c- F+ X9 p! K+ s4 r31.maze(i,j)=2;9 g7 Z; L' h' _9 |3 W1 e

- U6 n! A# a3 d7 c$ @, Y: F. t6 g% R32.如果所有可能的移动都被尝试过,将当前位置标记为2,表示当前路径是死路。
$ T0 D* v4 [/ v$ o33.end
' K/ ~" V. V8 w* A7 Y2 `: j6 n7 k, |; ^& I. g4 y; Y: K
34.结束search函数。: a% ]9 c2 G! r0 g+ ~
35.clear all
% R" x- C9 J6 Y
) U, i3 b$ K, d36.清除工作区中的所有变量。3 ~* M& F3 F% O4 W
37.clc1 w5 E9 }1 t+ b* o0 h

1 s9 q% F- z6 Y! c* V7 }  r; [9 `38.清空命令窗口。
; B$ d- j5 x1 P9 s( e  C39.定义了一个8x8的迷宫maze,其中0表示路,1表示墙。
8 o. N( D% F" j: q; K4 `40.total=0;
- D. A% y: N/ }8 T0 R! O1 s& g; c7 K: H  l# c0 G" O- ]" N: ]* u
41.初始化解的数量。
# W& J% A9 i+ t5 q, G42.maze(1,1)=3;4 ~7 Q& h& ]3 ~! p! U* D/ w; n

2 ~7 B8 R+ k5 }& F43.将起始位置标记为3,表示已经走过。
9 h% r5 [1 m0 }6 U; x44.[total,maze]=search(1,1,maze,total);3 [& Q5 V$ l7 N% ?* d- L/ a3 t4 V

- I" q; _0 ^' k# c45.调用search函数开始深度优先搜索。
+ }7 ^4 Z, j% C. J8 u4 x& q
) Z# b( C7 v- ]5 u; P, q整个过程是通过递归实现深度优先搜索,尝试从起始位置到达终点,并记录所有可能的解。在搜索过程中,迷宫中的可行路径被标记为3,死路被标记为2。搜索结束后,会显示解的数量和每个解对应的迷宫状态。9 A  O! E3 T& h9 d9 `$ s: B

8 O6 I5 _0 u! B4 m! B  P
0 W7 y- m& t# [) g9 O6 S+ @( t
# A; r# v' z" |  w1 f; a- F1 C4 h7 j3 b
! _! T1 m( p: T$ x; Y( J9 o$ V0 Y. J
( `* t' o' Q. l

深度优先搜索.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-7-28 02:35 , Processed in 0.273580 second(s), 55 queries .

回顶部