QQ登录

只需要一步,快速开始

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

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

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

1186

主题

4

听众

2922

积分

该用户从未签到

跳转到指定楼层
1#
发表于 2023-12-22 17:11 |只看该作者 |正序浏览
|招呼Ta 关注Ta
为大家分享一个代码,该代码是使用升读优先搜索解决迷宫难题
/ L2 e8 D" T3 W4 c! T* T  m$ B. F; ~% ]5 b* P7 A
当调用[total,maze]=search(1,1,maze,total);时,会从(1, 1)这个位置开始,在给定的迷宫maze上执行深度优先搜索。下面是对代码的逐行解释:- E/ X) Y4 _3 z$ e
+ E. j2 B; X/ \& ^  Z
1.function [total,maze]=search(i,j,maze,total);
* q$ }0 s9 N. @5 ?) K4 E. h0 }" R& n% c
4 @# u# P" N& Z' Y- q) m  U
2.定义了一个函数search,该函数接受当前位置(i, j)、迷宫maze和解的数量total作为输入参数,并返回更新后的total和maze。
1 B4 J5 P" A* j0 l8 v3 s5 e: s8 j7 J+ O$ R  K
% U% y+ N5 g* r- `# ]% B! n5 l
3.fx(1:4)=[0,1,-1,0];( R# A8 i6 z' j2 G: O! l" D" A
* E- [' m/ K0 g6 L
2 Q4 l  o+ A+ K9 W- f
4.定义了一个包含四个元素的数组fx,表示在行方向上的四个可能的移动。
  |/ \8 a! v& [" H8 g3 r4 N/ R( k" y4 @5 G2 ?) p- H

: H+ e# k$ I! v: w8 ^' O5.fy(1:4)=[1,0,0,-1];' _  Z1 h" Q: }& V/ d

; T6 B4 u; s5 L) g# o2 A& M: F- S8 Z" o2 L1 d
6.定义了一个包含四个元素的数组fy,表示在列方向上的四个可能的移动。& f" E5 Z3 w8 u) @2 |, W
& C7 |) ^, u! T, Y% i

2 W5 M( A# T0 ~7.for k=1:4
7 S3 g9 j) M- |6 x
+ _/ F* L1 `0 I- ~4 ?* E3 y+ P0 B' u8 ]. b- u: N# v  [, i
8.开始一个循环,遍历四个可能的移动方向。
3 O9 P# O7 \* [* f4 w# Y6 u# g- Z& {

6 A; s. {3 Q2 c" N9.newi=i+fx(k);
* g" O2 c3 K2 u! F3 u4 P/ |% R! F$ {' c+ E4 `

) S, h" K; w; G/ f10.根据当前位置(i, j)和移动方向计算新的行坐标newi。* u( l7 ~% \. u) y" u3 p* L! Y1 N
. Q" D# ?3 C  {. k9 V
; S/ E3 \0 T8 e; u
11.newj=j+fy(k);
: l, X& @. X9 {" Z$ {6 ^  b- \+ {3 \$ @5 D
! w# P! f" F& o/ ]7 k; g
12.根据当前位置(i, j)和移动方向计算新的列坐标newj。
, l& B* b# V5 v4 D  b$ ]5 J
9 a" p6 [5 O1 b( V- A& c+ M" H9 C1 ~4 L+ p9 }; `
13.if (newi<=8)&(newj<=8)&(newi>=1)&(newj>=1)&maze(newi,newj)==0/ Q8 w/ F5 g7 R# E* ?

. ]. I! M* X/ ?8 d
7 e: ^3 x- b' `0 |# W5 g14.检查新的位置(newi, newj)是否在迷宫范围内且是可行的(即迷宫中的值为0,表示可以走)。
/ L" A: ]+ Q1 C* `$ N8 K  {6 X
7 g' ?* p/ v9 i7 q) T4 M, h- T+ Z& X" r
+ {0 ?7 \9 B% ?* |15.maze(newi,newj)=3;
+ @% q$ B( V' {9 z+ I, e4 q, a1 m7 `: j; U
' ^* T; _# c0 D1 X" p
16.将迷宫中新的位置标记为3,表示已经走过。
# S- s- W" k% y' g; h5 b# `1 H" R$ u, k) r% G, y+ Y$ s; K# O/ }
3 W- T2 G- S" B7 w8 [% E9 g' R
17.if newi==8&newj==8
0 \* V  F& e% T# X( L
  r/ z- L; k8 w/ ?7 {) [* u. Y  F! Y/ n4 I
18.如果新的位置是终点(8, 8),则增加解的数量total,显示当前迷宫maze,并结束递归。) T, ?- O1 o4 W, s3 k2 K

0 D! H9 ?) _1 g9 V
# ?  c  r% X* ?19.total=total+1
/ _( i$ A# K& h% K' q* L. j2 V# ]7 B8 s# V8 V2 J8 {
20.增加解的数量。4 V6 s2 b8 L8 p0 ^. w2 k
21.maze; t3 g( U0 T' i' L1 v0 r& f$ O
* d' c2 B9 _- ?  p' ~8 C$ E* O
22.显示当前的迷宫状态。
  ]% E, x1 W1 y  q  D. ~23.else1 z+ m: x! F0 @, h& k1 z9 Z
6 q# b; ^) n( d( _
24.如果新的位置不是终点,执行下面的语句。
/ K9 M. [% p$ N1 M  R0 C0 X3 k25.[total,maze]=search(newi,newj,maze,total);$ f) d0 j& K5 ?/ X2 x5 L

0 b3 i0 n3 G2 P, ?# P  D0 ]5 B26.递归调用search函数,以新的位置(newi, newj)为起点进行搜索。
! u! C' m+ l; W# T, I- t27.end
4 s8 h, A4 y! }# L7 r7 B" }! N5 z0 S; A* Q* l! p* r/ Q, }
28.结束if语句。
' l& i$ G0 K9 g# [% x9 l$ F: [: o* ?29.end2 \; V# o& |7 u3 Q+ R  p

8 ]' @& x, f3 t' D" \30.结束for循环。
; G' U' Q0 b, @; O9 Z' V1 k31.maze(i,j)=2;4 D; k1 b3 h7 [2 z' P. {
( t, B4 R2 T+ d( k: t& d! d( j0 O
32.如果所有可能的移动都被尝试过,将当前位置标记为2,表示当前路径是死路。" a9 C/ x  }- _, p# V; U) `9 e: N
33.end6 B, ]" b- C: q9 _* J# r8 B4 L+ J9 W
7 u. y! ~; b: Y4 E
34.结束search函数。; m9 `  L# j% g% u  ?* K5 h
35.clear all+ s+ S5 z$ M  s& d' M3 u; d1 F5 L6 ?
9 o; ~, U8 {; F! e
36.清除工作区中的所有变量。
8 }  K) Y1 A* B% @" h  g( ^. W37.clc  r* [# l. _% K5 c! u9 @

3 i- j+ T/ u( Y& W6 X5 _38.清空命令窗口。2 o7 m* g/ x1 O9 P! C
39.定义了一个8x8的迷宫maze,其中0表示路,1表示墙。4 }- i0 ~1 O2 U. P
40.total=0;
  T* u0 G, x0 G" W+ E0 c$ \8 M* R& |: h( y4 r
41.初始化解的数量。
+ s2 ]; k, G4 b  b- M42.maze(1,1)=3;' a) G+ t( \% K0 o8 W/ a- s

  }% x. W7 z4 S' q# Z- I1 ?: W# `43.将起始位置标记为3,表示已经走过。; P- p* v* a( a7 D7 X; Z
44.[total,maze]=search(1,1,maze,total);
" \0 Z$ ~& `+ \7 s& a, _4 ?& P( O/ z# N7 c
45.调用search函数开始深度优先搜索。
7 g& ?6 i1 S+ [9 I1 w2 x) e1 ~2 H* r  ^/ i* l8 Z, u$ ?* C( _
整个过程是通过递归实现深度优先搜索,尝试从起始位置到达终点,并记录所有可能的解。在搜索过程中,迷宫中的可行路径被标记为3,死路被标记为2。搜索结束后,会显示解的数量和每个解对应的迷宫状态。
! b* \( E1 |1 d& V+ z
$ K4 y. u1 M8 G0 n: O; S* B) r: y: }6 Z$ \  Y7 |. o( w5 [
. x/ _3 Z, f% Q6 n7 P" D* {: ?
9 m; n  k, H- l! U" q
% |0 A0 J+ n5 A/ R

8 Y0 R2 u( _; B% M& r5 ~6 [

深度优先搜索.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-4-12 03:53 , Processed in 0.403962 second(s), 55 queries .

回顶部