QQ登录

只需要一步,快速开始

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

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

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

1189

主题

4

听众

2934

积分

该用户从未签到

跳转到指定楼层
1#
发表于 2023-12-22 17:11 |只看该作者 |倒序浏览
|招呼Ta 关注Ta
为大家分享一个代码,该代码是使用升读优先搜索解决迷宫难题9 O& ]. J9 _1 Y' T$ a

% L8 B) P; A5 W4 ~' R7 o当调用[total,maze]=search(1,1,maze,total);时,会从(1, 1)这个位置开始,在给定的迷宫maze上执行深度优先搜索。下面是对代码的逐行解释:
: b4 W. I1 Q9 W( s% Y. V9 g' K* O; i' B; @' ]! y4 Y
1.function [total,maze]=search(i,j,maze,total);' Z( l7 j; a0 B" g, h+ D3 K

* [' W7 l- e& `3 W5 q
: T/ P& M  W: L7 e- W2.定义了一个函数search,该函数接受当前位置(i, j)、迷宫maze和解的数量total作为输入参数,并返回更新后的total和maze。
! d/ \, S( Z0 F; w" a6 k3 U" p6 M  H9 W/ Q% n8 G
4 D7 o# D' f& o  O! s5 P8 M/ h0 |
3.fx(1:4)=[0,1,-1,0];
; D& Q$ n( p* G4 [: d
( g5 o8 F3 Q7 ~) {' i& V% b6 F0 N4 V% ]3 d
4.定义了一个包含四个元素的数组fx,表示在行方向上的四个可能的移动。
# j7 P3 K, R1 R/ s
' Y6 `3 f! D# I6 r; G* a# ~3 m5 |8 a/ ?! S* U% M7 ]
5.fy(1:4)=[1,0,0,-1];
4 V/ k* X- N2 v+ D* P3 |& E1 [; z$ P

! Q6 X; q+ g+ h6.定义了一个包含四个元素的数组fy,表示在列方向上的四个可能的移动。
8 @( Z4 Y+ D0 I3 Q- B1 M- q$ r1 l9 P* k5 l9 z! ]0 Z. F! V
0 l& h+ Q! |+ Z2 E' A5 w
7.for k=1:4% r% K( [  I; ?5 h7 L1 }# B6 K
4 x9 n) |: M& r5 ^& L* U
' d! W9 w/ z% l. E
8.开始一个循环,遍历四个可能的移动方向。
/ f" I$ c9 W5 t6 `' G9 Z
, t# n4 i  o: ]4 [2 M. z
: r: K5 B; J; t& n9.newi=i+fx(k);
; w2 W5 m: a3 e" a! [" ~( N+ l
% H4 l( l3 w9 E7 X' ^% I) Y! }* h9 J# s, |( i6 k9 y3 h% l
10.根据当前位置(i, j)和移动方向计算新的行坐标newi。
" h: I  j. M7 \# }! \6 I7 H$ C  i4 L( Q

1 r$ w5 P  B( j" c0 d& k11.newj=j+fy(k);
2 e5 p# M1 S' k) f
$ _, J, }5 c& j7 a, f9 E" ]
7 f0 a6 Y& B( U" r- J12.根据当前位置(i, j)和移动方向计算新的列坐标newj。5 \& |- G7 t# e

" q# v! c5 }7 a( |7 D
* {" @. ~6 S* `2 Z7 f13.if (newi<=8)&(newj<=8)&(newi>=1)&(newj>=1)&maze(newi,newj)==0
$ X8 I% H6 b% H3 E, ]6 h" T8 E4 i4 C8 l/ G! i# F$ _

, v6 E5 e5 V' }; c14.检查新的位置(newi, newj)是否在迷宫范围内且是可行的(即迷宫中的值为0,表示可以走)。% q) I7 G4 a2 {6 u, m* B* o8 w

( n$ n8 p0 {2 i0 i$ e: T6 m7 g8 ]# \+ i1 r
15.maze(newi,newj)=3;
4 E* P* D, Q) S6 B$ v. q9 _- m. x/ D" z

+ s' v7 M" P" }9 o- z" _" j16.将迷宫中新的位置标记为3,表示已经走过。# Y8 U# {0 o9 W* f9 y; r) ?
3 G* }, O$ Q* g. j7 _) W

7 x- @3 F- o6 N# Q' n1 ~17.if newi==8&newj==8
4 o0 _4 ?9 e  v! S; a+ o1 O4 E' H+ |8 b+ j; t& ~* z
8 a# l  A/ e, k7 w5 h: k
18.如果新的位置是终点(8, 8),则增加解的数量total,显示当前迷宫maze,并结束递归。$ @* c2 |( r, h8 G7 F$ c

# u: s/ h0 T; a2 g9 Y4 H
4 P- ?! ?% P- w8 U" z; @19.total=total+18 ~' y8 D7 O8 W/ x1 T9 k

; J7 ]3 F1 i- U) U  a* O! l: I20.增加解的数量。' Z+ v0 }9 F3 R5 [+ K6 Q
21.maze6 e7 v2 ~, V0 C; \

7 D) s5 K& J% l5 H, ^22.显示当前的迷宫状态。
1 ~. o0 e5 _1 t6 I23.else
. U) L; |9 Y2 _) @$ H1 ~
/ [$ e9 r9 v; X24.如果新的位置不是终点,执行下面的语句。: t; ]2 |4 m4 o& Q1 x, g
25.[total,maze]=search(newi,newj,maze,total);
6 n) N) W5 l: ^
* V' e' X; S- `& M  R4 \: T1 ^$ c( f26.递归调用search函数,以新的位置(newi, newj)为起点进行搜索。
3 \( P, X3 a7 `" v3 R27.end
/ H% G& {6 V3 }! y3 L
( R( C) x: h2 d28.结束if语句。: T, A2 n- M* K6 ?$ k  {
29.end) W0 V/ q  h) h4 f# U. n
6 Y& g; P5 a5 ]0 s2 [
30.结束for循环。, I: ?; e; ]& h; B8 _+ n
31.maze(i,j)=2;
; K( h7 l$ W% }+ l6 Q" F
# m: |$ O7 W( z) \" v# V! I" J32.如果所有可能的移动都被尝试过,将当前位置标记为2,表示当前路径是死路。
8 V' [! r6 X1 [1 r1 l: h8 R* V6 U33.end, D- g$ w: x/ ^0 f; A

5 n" s2 s. d! k7 c" B34.结束search函数。
; `% p2 o7 w, i  V1 w$ {35.clear all
/ M6 g8 q9 G/ H4 ?. F: X1 K1 |0 L. x- W5 i# }, h4 G
36.清除工作区中的所有变量。8 {+ z5 S6 G% ?0 I0 @
37.clc
6 J; \) Q' ?/ Q' }9 M6 f/ |' R6 S& f8 D+ G9 c  q% d
38.清空命令窗口。2 v# Z1 n- T# k$ u$ n9 Z8 @
39.定义了一个8x8的迷宫maze,其中0表示路,1表示墙。
0 s4 W3 j. X1 d7 U( w$ q. T: }! l40.total=0;- g7 j9 ~* v  y1 j/ E7 y
* d6 k3 n: `9 ~; C# ~* Z0 U
41.初始化解的数量。8 w; Q8 M) A# u8 {  h
42.maze(1,1)=3;+ E9 G1 l( v& U. ^! q: F
4 M0 g) [' m# P
43.将起始位置标记为3,表示已经走过。: w* ~! \2 w4 o0 R8 g
44.[total,maze]=search(1,1,maze,total);+ v5 U+ w7 R0 V% W4 a

1 z" e3 Y( g; }  [45.调用search函数开始深度优先搜索。# U& M& L4 m& J# `5 O

- u, P5 D/ n- r" J, }" ]  a: Q1 _整个过程是通过递归实现深度优先搜索,尝试从起始位置到达终点,并记录所有可能的解。在搜索过程中,迷宫中的可行路径被标记为3,死路被标记为2。搜索结束后,会显示解的数量和每个解对应的迷宫状态。$ O( E' P; S/ J9 Y* @. A7 |

. K0 z8 G  X- W9 q9 n% `3 |' ^" T& b7 y

" Z9 H  q/ t' F7 U( _4 l3 x/ d4 N2 n( [. }# Z/ I: @9 z" ]
5 |5 o+ ^* N2 o

& A+ [, H5 c/ f

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

回顶部