QQ登录

只需要一步,快速开始

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

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

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

1189

主题

4

听众

2934

积分

该用户从未签到

跳转到指定楼层
1#
发表于 2023-12-22 17:11 |只看该作者 |倒序浏览
|招呼Ta 关注Ta
为大家分享一个代码,该代码是使用升读优先搜索解决迷宫难题) C$ k' u) N" b
- `) A& B. F% l3 k0 L" O  i
当调用[total,maze]=search(1,1,maze,total);时,会从(1, 1)这个位置开始,在给定的迷宫maze上执行深度优先搜索。下面是对代码的逐行解释:
" R& f( L: D% Q+ J8 i+ m( _. }% Z2 @  g  [9 Y: G! a/ L
1.function [total,maze]=search(i,j,maze,total);3 L; y# o* |2 Y! ~8 Y& _' _
! u, R' Y, d: o; Q, F
) \- j1 E7 W; C/ s/ T, G
2.定义了一个函数search,该函数接受当前位置(i, j)、迷宫maze和解的数量total作为输入参数,并返回更新后的total和maze。) Z& }/ K" B1 ]  V7 s/ ^$ R$ [- s6 X, Z/ H

# R5 b3 T2 T% J3 T5 w  c" c2 G8 ^$ N
3.fx(1:4)=[0,1,-1,0];+ j; y5 R+ E' s6 y3 b& v5 n) f
! B( z/ t% ~% \2 a9 [: R% W) Y) j
: o2 g, U& @, |; c
4.定义了一个包含四个元素的数组fx,表示在行方向上的四个可能的移动。
% D$ J- h8 b5 U3 O5 K: g4 P) V& w) L( g1 g5 B
+ U; C5 l, M" P9 M: B
5.fy(1:4)=[1,0,0,-1];8 A( k% |) d' L/ `4 h& }

8 \) F& t0 X$ }5 ], Z4 n1 i& |3 f6 c+ C
6.定义了一个包含四个元素的数组fy,表示在列方向上的四个可能的移动。. a: d8 T: o( I

0 j/ ?! T8 {1 d  p0 p1 F7 o! X# G: [; Q% A
7.for k=1:4
, _, ?6 {  R# X( \
, p3 X: n% D1 n& `- _
, ]9 W9 F( M- H! M/ b! n% N9 f8.开始一个循环,遍历四个可能的移动方向。
* U7 f9 Q( L* r5 r) C
6 |5 @- d- c5 o8 \- b1 R% @+ m. n$ b
9.newi=i+fx(k);
% n7 y3 m4 W( S! M
# n; K! }; _2 V* N8 E+ r- `1 e; ^1 @5 {
10.根据当前位置(i, j)和移动方向计算新的行坐标newi。
6 P7 |4 M, l2 B3 ]3 U) k6 K, Z' l, F( m5 }

$ D( I. X0 ~2 R11.newj=j+fy(k);
& u7 h  C; s$ @$ ~, g* Q8 X( v  u" v6 R: `/ N9 Y8 @& p7 x; I0 c  J4 \& {2 s$ y

4 V0 t5 V( j1 E; p$ n# d12.根据当前位置(i, j)和移动方向计算新的列坐标newj。% E  _" @2 h2 h2 c
% x+ n" ?, T6 A- b, A, j6 K5 q

; E1 J# D$ E" |* k# Z: k( W13.if (newi<=8)&(newj<=8)&(newi>=1)&(newj>=1)&maze(newi,newj)==0
( n& g5 o; Z! k) E- ~4 x; Q1 e& C2 u3 e" N; R0 ?7 b. Z2 p1 D

# p# \; c0 ]9 U6 o. U14.检查新的位置(newi, newj)是否在迷宫范围内且是可行的(即迷宫中的值为0,表示可以走)。8 \6 G& u5 |) v& C4 x6 a

# Z6 p8 K* `1 ^/ j2 _7 Y# @4 n/ [, F% X7 U9 ]1 s4 b8 y
15.maze(newi,newj)=3;
2 O8 P5 ~1 M9 O; ^- ?
; [4 v! Q* z7 f: v1 R+ ]# v$ N( |9 X# F. H3 _0 j/ w
16.将迷宫中新的位置标记为3,表示已经走过。' v' n/ D! X2 }$ i

( z. t: a2 y" ?% B' t$ z6 G4 U; k0 w; m: s  _/ ]; G2 Q+ ~
17.if newi==8&newj==8
7 F8 g2 S) t# W) O* {9 M3 M! {+ K  O

5 H( z) A( Q/ f+ c% r( U  V& y7 G18.如果新的位置是终点(8, 8),则增加解的数量total,显示当前迷宫maze,并结束递归。
& Z+ r5 B6 V0 u' w. b- F- t$ C" r( c6 C

5 V, \8 }% ]$ M1 V1 y1 `19.total=total+1
- i8 g: E* l7 t3 _# q0 p
  z) {; w, |. z20.增加解的数量。
9 |& a' y; {. V6 B6 u21.maze  _6 s% c, v! Q' |1 H  K

3 W4 ]6 `6 y5 t% G0 X22.显示当前的迷宫状态。
5 W% t, R+ T' T2 Q23.else
" E$ X3 G9 l' Z3 `4 {  E0 |% D
* R% A  x* Q; D3 Y3 x. R8 B1 L2 M24.如果新的位置不是终点,执行下面的语句。2 s$ n  a! k' p- G0 ~6 E
25.[total,maze]=search(newi,newj,maze,total);
& }! ], R! p) I  n* C9 ]
; Z# g/ k4 g7 j4 e: @. q26.递归调用search函数,以新的位置(newi, newj)为起点进行搜索。
- _3 _' w. e9 [2 O0 H27.end# e) \6 }- L7 C/ Q9 r9 }

+ D  R3 B9 e4 ~& X28.结束if语句。  I% ]( U7 H( k$ b
29.end
5 q1 L, R4 p" }: m+ @. \9 O2 q- d/ k+ X/ y
30.结束for循环。& t# ^' T; l3 X8 Z
31.maze(i,j)=2;
. L- G+ [) u  |& y
5 Q2 c; c. m7 g' P1 k32.如果所有可能的移动都被尝试过,将当前位置标记为2,表示当前路径是死路。
! E4 w: P  K7 h' ?33.end; v( _7 V3 h" P

1 _3 j: K, p$ d, t$ ?34.结束search函数。" @8 a  y9 ]8 I" Z6 a
35.clear all
2 ?6 y# \+ s% ?2 u# B  W
! Y. q5 O: `6 C36.清除工作区中的所有变量。3 I" Z' c  e  w4 ]( D! e4 o
37.clc' \! }8 j, I1 m6 e
; [6 ?% _0 N+ |5 y
38.清空命令窗口。- d; ^* U7 s% X* [2 J& g9 k
39.定义了一个8x8的迷宫maze,其中0表示路,1表示墙。
7 i+ D% _: |' s! B# v+ B, f40.total=0;5 h* ]2 [6 S0 K! u

- A# x/ z( J9 F) f) H41.初始化解的数量。$ D, D- E$ e6 C! z' a
42.maze(1,1)=3;
6 E: D2 z2 t+ E0 v2 H# s. C! d" s9 a+ T" o
43.将起始位置标记为3,表示已经走过。
- ]) i, f& w  k) d. F/ b: P6 B44.[total,maze]=search(1,1,maze,total);
# g- o8 ]4 ~2 \1 h2 w' W& l% v) {& N: [3 {) J
45.调用search函数开始深度优先搜索。( N8 R$ Y, _2 Z2 j" b
. z$ x! S1 ]% p: B$ }: _% B! Z" A
整个过程是通过递归实现深度优先搜索,尝试从起始位置到达终点,并记录所有可能的解。在搜索过程中,迷宫中的可行路径被标记为3,死路被标记为2。搜索结束后,会显示解的数量和每个解对应的迷宫状态。; `: J, L/ m" k, r- b9 e' p, k$ V4 ~7 ?
  V% |* F, S0 s5 m: Y9 d

3 t/ y  `0 y9 ~" `, L8 l- G1 Z1 }5 j/ [, c

0 j6 p& a4 p% ^  S) ?. l2 H# B- g; G/ p7 @: p# p" W3 g

3 h! G: ?$ b9 T

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

回顶部