QQ登录

只需要一步,快速开始

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

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

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

1189

主题

4

听众

2934

积分

该用户从未签到

跳转到指定楼层
1#
发表于 2023-12-22 17:11 |只看该作者 |倒序浏览
|招呼Ta 关注Ta
为大家分享一个代码,该代码是使用升读优先搜索解决迷宫难题! M3 p" e+ p9 E) N* o

/ U" Q- j' j6 F! h, J- J当调用[total,maze]=search(1,1,maze,total);时,会从(1, 1)这个位置开始,在给定的迷宫maze上执行深度优先搜索。下面是对代码的逐行解释:2 V) n( i- X, C$ m. h
4 }- f. q6 f! ^1 n( \  o
1.function [total,maze]=search(i,j,maze,total);
3 t$ Q! u  g- e2 M0 t, ?) k& M* [, H  r5 r

& F. g# G9 M" E+ o2.定义了一个函数search,该函数接受当前位置(i, j)、迷宫maze和解的数量total作为输入参数,并返回更新后的total和maze。
( d0 V# p& U9 s9 {" [
: T! B% t& k5 n9 \% f& r. _2 p% e% U& G" i& X) X  ^$ r
3.fx(1:4)=[0,1,-1,0];8 d3 D  ?: u- p# L. F+ [) r: B3 v
; K1 i" c  ~2 |% T
7 Q6 L, R% f5 A: u% ~$ ]2 u- n
4.定义了一个包含四个元素的数组fx,表示在行方向上的四个可能的移动。
/ V3 q6 W3 E" m) o. u$ O
& Q/ s- x  f& O2 h0 u0 V- A2 t. v, g% X6 H% E
5.fy(1:4)=[1,0,0,-1];- s$ v& d6 L& o$ a9 Z
) J8 U& X0 g+ D! K$ e1 q8 r  d
7 g+ Y  }- }6 |3 Z  ?
6.定义了一个包含四个元素的数组fy,表示在列方向上的四个可能的移动。
  H2 |  |% f# q. o, v: I0 E# N, c- e& a" Q, B$ y

! `3 Q! I4 Y* P8 Z7.for k=1:4
/ j' V' h& K, B8 M+ E) n. \) X3 y: d+ Y/ d9 i
7 I  g9 O. b: _9 g# }
8.开始一个循环,遍历四个可能的移动方向。
0 m; o) k6 P) s2 U  `/ z1 {- H
4 `2 ]- B- N3 G: z; \# g8 |- T: [+ Y# f0 {7 @
9.newi=i+fx(k);9 r. I8 B5 _4 |4 f6 j: N& S: l+ @

, @6 J9 K: g" }5 z) K$ L9 a' S' _
10.根据当前位置(i, j)和移动方向计算新的行坐标newi。
: ?7 o+ i5 t0 e* \; u* i% w% D6 Q) p

& i# z3 `2 k8 U' P" a. }# c11.newj=j+fy(k);
  a/ o8 ?% Q* [2 I- B
; P9 X5 V7 T/ s# d( ~* D/ w
- h8 [/ k9 I9 w" ^- U12.根据当前位置(i, j)和移动方向计算新的列坐标newj。& N% w  t5 V; b
9 z, @& E) a! \! L9 `" V
6 F# e0 G8 u) X4 G, @
13.if (newi<=8)&(newj<=8)&(newi>=1)&(newj>=1)&maze(newi,newj)==09 R& D! L1 Z+ L5 y5 b$ h" v6 }$ b
4 w7 W5 u2 e6 x0 M5 x, n
% W3 K- j* K6 \- b. z: E4 z
14.检查新的位置(newi, newj)是否在迷宫范围内且是可行的(即迷宫中的值为0,表示可以走)。, m* G0 x; @: b) D

$ w% j, ^' s! }* ^; {5 X: x; }; I: A" z; L
15.maze(newi,newj)=3;" Q* T5 r) f6 w0 K' }( f

& U" O1 `2 P: m
4 d4 F0 y6 T2 s2 ~$ F16.将迷宫中新的位置标记为3,表示已经走过。: X5 M1 L- q8 v9 g8 [( u
5 ~, W5 N! L: _$ J! m

. C- O  ^) B  T" i" c( Y17.if newi==8&newj==8
) s: p/ h/ m% z0 Z( H8 |
3 B# b+ A/ t4 [  ]  b0 p. D% q
& \1 M4 _9 q9 K; A9 c5 ~18.如果新的位置是终点(8, 8),则增加解的数量total,显示当前迷宫maze,并结束递归。
* ]7 C' Q2 I/ o' _) _5 z8 _: ?
' u+ p2 _" j3 g, D* p# M+ ^6 {* Q) ]
7 n! q0 `( L8 m+ ]19.total=total+1
! O" \# k4 x5 R* ?8 o# K' l4 f3 _  p
4 `7 C! k7 R+ K, t  E3 K20.增加解的数量。7 E3 ~/ q& @" G, h
21.maze- ]9 l, o3 N* z
4 }' x9 l, \1 @( X0 F
22.显示当前的迷宫状态。( I+ J( P! Y' F+ X& |. m0 y
23.else2 L% a- w/ t0 w+ F) y( t
' Y! [& l5 N, o/ z
24.如果新的位置不是终点,执行下面的语句。
. V+ s& c+ U4 x9 ]6 ]7 P25.[total,maze]=search(newi,newj,maze,total);+ K: j/ ]$ g# ?% K0 t

' w% k+ t5 q+ e7 @$ ^* m26.递归调用search函数,以新的位置(newi, newj)为起点进行搜索。; Y# e1 B% V! W$ T
27.end. V, u% ?5 X5 J1 \1 [
( X! `) J! c" q( d4 r
28.结束if语句。
* Q/ i6 A2 [! _29.end5 c5 A* n/ ?% o

6 R7 j% ~6 J  m& \5 G7 A5 `30.结束for循环。5 {; m% N; n" D
31.maze(i,j)=2;6 ^/ E0 `; [7 C9 ^7 @. g

5 K+ X6 H  o( g' h6 z- H1 q32.如果所有可能的移动都被尝试过,将当前位置标记为2,表示当前路径是死路。
! A( `- M, r- ~, |/ t$ Y4 l8 @/ u33.end
" a4 P  n' R  }  N% O
  A  w, B1 W' B34.结束search函数。8 {+ G; k* o& f  Y
35.clear all+ ?% ~+ M/ c; B' f( k+ V7 z

2 k5 v; [# A2 @7 ?0 p  R36.清除工作区中的所有变量。* Z, D2 N/ Z1 o8 l
37.clc6 B3 K3 |% B: e8 J1 W" ?9 `, i  `

% |/ w" T% W# j38.清空命令窗口。
' v6 c; e( k* \* E( u; P9 k. F39.定义了一个8x8的迷宫maze,其中0表示路,1表示墙。0 t! }6 [( q' N' I8 D3 {- g
40.total=0;! d1 q2 T& e: {) Q; a8 E* w$ R) b: V

: g2 [/ s2 I0 y# `8 @0 O6 j41.初始化解的数量。% V8 C( E- a! _& b
42.maze(1,1)=3;
7 |% X$ G% L$ q0 ~; q
! z. L. A+ \* r1 j6 S43.将起始位置标记为3,表示已经走过。4 g: f5 X  Y5 X  D' J  ?, X  c4 n
44.[total,maze]=search(1,1,maze,total);
* G5 E, z7 t5 w7 g0 ^; q5 h5 T* v7 M; V/ ?' _  @' j
45.调用search函数开始深度优先搜索。
6 K* }" l$ p, w( e2 r9 l
0 _4 b% @: G' |7 v; ?整个过程是通过递归实现深度优先搜索,尝试从起始位置到达终点,并记录所有可能的解。在搜索过程中,迷宫中的可行路径被标记为3,死路被标记为2。搜索结束后,会显示解的数量和每个解对应的迷宫状态。
' n8 Z4 P2 R' S- f9 C7 k4 y4 G3 I" c8 M4 I4 o4 a" i4 a4 s& I
  U' M2 D  b4 V: C' v; R

! u; y$ n/ X7 I4 D, G+ p7 F8 i. E9 @! F$ \, D8 i
# r( E) X+ p: I0 E' C

  K% r9 d' q" ^: T6 A

深度优先搜索.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-13 05:55 , Processed in 0.416090 second(s), 55 queries .

回顶部