QQ登录

只需要一步,快速开始

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

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

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

1189

主题

4

听众

2934

积分

该用户从未签到

跳转到指定楼层
1#
发表于 2023-12-22 17:11 |只看该作者 |倒序浏览
|招呼Ta 关注Ta
为大家分享一个代码,该代码是使用升读优先搜索解决迷宫难题  N9 A% q( D6 K% j4 M3 F

( }- y/ S1 {5 A5 i2 }当调用[total,maze]=search(1,1,maze,total);时,会从(1, 1)这个位置开始,在给定的迷宫maze上执行深度优先搜索。下面是对代码的逐行解释:
4 v( u. x' p& r2 x8 g3 x6 \, V
1 B/ y( X5 c4 E$ }4 f  Q1.function [total,maze]=search(i,j,maze,total);
; }: j3 Y4 V1 o3 H8 L8 q6 G
5 Q* q9 V3 {3 \/ j' b3 i& I
5 o1 X7 x2 v+ g8 U6 T+ F2.定义了一个函数search,该函数接受当前位置(i, j)、迷宫maze和解的数量total作为输入参数,并返回更新后的total和maze。( X3 W% }! j; Z, Q% _# n

9 c, h% T$ D2 ^- M# T) S4 ]
$ W- H5 h! T) ?$ f8 t3.fx(1:4)=[0,1,-1,0];* U4 Z3 ~. t6 \  @( I9 B* Q

4 J* n& X7 }  {2 i4 t3 ]: ?( F) ]; E
4.定义了一个包含四个元素的数组fx,表示在行方向上的四个可能的移动。
% R. L# H' f+ d! D9 R8 D5 V' j" O! a! B

4 ^, n2 C7 ]8 ]* {8 h0 _. `, s+ U5.fy(1:4)=[1,0,0,-1];
( `# P; t% Q* X3 h  @# s; `2 i* f
- M3 C) x/ l+ S- @" z7 R
* W: m$ n/ u: J0 s, v# n& L6.定义了一个包含四个元素的数组fy,表示在列方向上的四个可能的移动。- I1 m. M7 [, P8 X" l
4 b. s  E1 z) M6 G6 S

) u8 [% J0 o3 a: ?2 m  F7.for k=1:4
( |) ^4 u2 I3 G+ [, w& v% n$ R0 A7 e4 U9 [5 E
# K* s9 q% D% G! d% S/ p
8.开始一个循环,遍历四个可能的移动方向。- |! E; e( n) i( I7 m# Q

% k% P$ g- U/ @1 M  X9 [0 {. }* B- T3 E% S2 w. z
9.newi=i+fx(k);4 X* c  Q# x" I& [# ]% S+ E: M

2 I1 _) r. x( o: i
: z  S$ B, i6 P10.根据当前位置(i, j)和移动方向计算新的行坐标newi。
' y6 ~: L" f% ]) y3 @2 r& t) N6 b3 u2 \! H5 ~

4 z$ ~- ^' g* Z' U3 D11.newj=j+fy(k);
2 ]  v% C$ f. {" z8 T+ N4 U- r4 ]# X9 s. e3 o8 H

3 u  p# q6 b- w; V12.根据当前位置(i, j)和移动方向计算新的列坐标newj。
) I7 _7 ?+ y& X2 m. f1 ?
! e, R- v1 I9 j! q0 d$ [, s8 y% f1 h7 E
13.if (newi<=8)&(newj<=8)&(newi>=1)&(newj>=1)&maze(newi,newj)==0/ Z: E1 {$ j- P8 J+ I  c

' `' i+ P& ~0 Y* t, i  F
+ i8 f5 w9 l/ n  ^14.检查新的位置(newi, newj)是否在迷宫范围内且是可行的(即迷宫中的值为0,表示可以走)。* T4 [2 l4 r1 _) P* Y2 k! D8 G& }
( }( s0 w; n  o* [( k, \7 ^
) @7 z4 h4 R6 ?; B0 X, K6 D
15.maze(newi,newj)=3;
% U+ k, y2 M% @6 j) p
0 W/ f* S; I& m3 [% I6 N& J: i
+ u& A2 D9 g9 A16.将迷宫中新的位置标记为3,表示已经走过。$ }$ w& P2 f2 M6 `" [

/ R5 D5 x+ Y# N$ h* g$ I# q
+ ]9 K5 |) U: }17.if newi==8&newj==8
3 |; ?9 J& G1 ?8 [$ d( F; W4 K2 J5 K8 {. }# }# |
+ D: p7 K+ a, A) \2 p3 K) y
18.如果新的位置是终点(8, 8),则增加解的数量total,显示当前迷宫maze,并结束递归。8 c2 U/ J8 c. z+ s! f

6 z9 A/ H3 V! d0 j) y4 `  k3 z
- Q: S' ^/ l1 ~0 c- q+ s19.total=total+1
$ f& j1 g+ p) e% i  S6 K1 d- ]) A" P* J
20.增加解的数量。& ~% z: z% a% o- V3 ?$ [% T
21.maze/ p7 R) N) _5 Y5 f. B
4 V: i& |: |: g7 Z5 R/ n. t
22.显示当前的迷宫状态。
7 N' J+ U* i5 R0 Q23.else
1 w0 O  c. T6 u1 F! F& v& y1 |1 V5 d1 d
24.如果新的位置不是终点,执行下面的语句。/ C' f+ ~2 p5 `% h( L
25.[total,maze]=search(newi,newj,maze,total);
2 X# N- X" s# R9 |6 C# F
5 o! H6 g" n1 W( c1 ?4 w' M26.递归调用search函数,以新的位置(newi, newj)为起点进行搜索。7 @2 [+ l! D5 q" ~' Q9 s) H+ R
27.end
( V# |2 M! e9 u. e5 @1 ~. m
* ^2 s' \% h. _28.结束if语句。; j& B8 i0 y  `! v" ~3 w3 q2 `
29.end
- x3 f3 h; \/ E. t6 ?/ O  R1 r1 T& W/ v# ^
30.结束for循环。+ t- e$ W6 d# _* Z; \; ]
31.maze(i,j)=2;
+ k2 x, L) F( w' w- f1 B
: \6 j. z5 d0 |32.如果所有可能的移动都被尝试过,将当前位置标记为2,表示当前路径是死路。
2 Q! E3 g& g/ G# k: c" b& O* i: k33.end0 m$ c/ |' Q0 |7 ^
% q8 D+ O4 J; R6 i& v2 B
34.结束search函数。1 c+ ]! L9 k" L+ F4 P
35.clear all; e5 }; e: e+ a) A) e

3 G/ c5 q0 d. ?& M, p. T* E5 c36.清除工作区中的所有变量。! J! N$ u( l  q( Y+ e4 m
37.clc3 s9 I: k3 n1 k$ {+ i& Y

* p$ u/ ^2 _. o6 U' a% o' \7 X38.清空命令窗口。; U9 J" G/ Z2 l# E* R$ _& n5 s
39.定义了一个8x8的迷宫maze,其中0表示路,1表示墙。4 t" U$ \& j- m3 F, {# R% y6 Y& A$ h3 U
40.total=0;" L1 z: u1 _7 |% n& R

! M: X+ K% s' W& l# E6 ]4 n41.初始化解的数量。1 T2 j6 i* ~* Y6 H& Z8 K
42.maze(1,1)=3;4 {; v$ r0 K: M
2 a- m/ X3 J# O# m. q# b: O
43.将起始位置标记为3,表示已经走过。
  `9 {0 M7 B3 [* H( Q/ L* V  z7 n0 t44.[total,maze]=search(1,1,maze,total);$ u; A- i7 U0 z7 @0 g* F2 [# r
& {) \* Y4 s2 L$ }2 s" |6 G
45.调用search函数开始深度优先搜索。
6 A( \  D9 t; B  n* g- P( n9 S* |. i7 H! @9 [" y8 G
整个过程是通过递归实现深度优先搜索,尝试从起始位置到达终点,并记录所有可能的解。在搜索过程中,迷宫中的可行路径被标记为3,死路被标记为2。搜索结束后,会显示解的数量和每个解对应的迷宫状态。/ t: c; \7 R5 v( u6 P; m6 t

+ c0 `* s8 O2 q
6 W6 H6 O) J! ~; y$ c  ^6 h. v% P) L7 g$ P' Z$ Y1 @
  p& n. _: S5 P" S7 S" L; X
6 Y( e* v: G# L# R# n, n: h, T
8 _0 D7 I4 ^* B3 _" W+ O

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

回顶部