QQ登录

只需要一步,快速开始

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

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

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

1189

主题

4

听众

2934

积分

该用户从未签到

跳转到指定楼层
1#
发表于 2023-12-22 17:11 |只看该作者 |正序浏览
|招呼Ta 关注Ta
为大家分享一个代码,该代码是使用升读优先搜索解决迷宫难题
6 X- i% f/ V: f5 F' ]4 `5 x1 o
/ t* Q' J0 Y6 o, Q8 S当调用[total,maze]=search(1,1,maze,total);时,会从(1, 1)这个位置开始,在给定的迷宫maze上执行深度优先搜索。下面是对代码的逐行解释:, f& X3 l) k. I; D
3 H1 K# l: F+ z; m  L0 \2 B- E
1.function [total,maze]=search(i,j,maze,total);% M( U2 `, W& E  Y- h
. {3 ?& R) |; F4 K4 k

2 ~, ~/ ?! h5 M8 G. R2.定义了一个函数search,该函数接受当前位置(i, j)、迷宫maze和解的数量total作为输入参数,并返回更新后的total和maze。: D  x$ V: i" n5 I+ ]
& o- {/ s2 [4 a2 [! F5 E+ E4 p
3 ?- @/ C% n( c: T& r
3.fx(1:4)=[0,1,-1,0];
2 \) r3 x: m4 ~# n3 g& `8 m4 X6 `1 W  {1 M) w$ w# X: b9 L5 C1 ^
3 E- K. T" M+ b- N. i. u
4.定义了一个包含四个元素的数组fx,表示在行方向上的四个可能的移动。5 L* `- C1 [% C7 m  S

/ ~6 t' k, `  Q! I" w! X6 ]% T3 F% Q$ Y
5.fy(1:4)=[1,0,0,-1];/ i! I  z. v2 Y
9 N0 A( h, Y  s3 n' \: ]
, [. S. \' C" o7 R* y
6.定义了一个包含四个元素的数组fy,表示在列方向上的四个可能的移动。
2 ?; V, \' Y# H. H- |
: K0 _# H! _# O: S8 v( Y& o4 }
7.for k=1:4
5 ~& B% q1 C& y, q; h9 f! _, j6 ^" L' U0 l# d

1 @9 [$ l% I  d& n3 _0 ?8.开始一个循环,遍历四个可能的移动方向。
' b+ S3 s1 z# c9 ^
5 j0 L, Q& y# ?$ {' I( F# _: w5 W7 X" t5 k9 X& {
9.newi=i+fx(k);
# q1 P" Q* k' K7 P6 K3 u4 F, ]" O! ]+ n, l9 H

* J+ z# v* m! v10.根据当前位置(i, j)和移动方向计算新的行坐标newi。
) {* o" m% X8 v
. l1 x+ _4 c  Q  g+ z! M( V% o1 X7 K
$ d( Z; }& L3 b8 }11.newj=j+fy(k);/ Q0 Y) T5 X) w2 {: I2 K  r4 x" z
% j" d8 {& r9 i+ \
' I/ W3 l0 G6 j4 N' l# R
12.根据当前位置(i, j)和移动方向计算新的列坐标newj。6 A& b8 }' q& A2 n2 ?1 M

/ ^7 X: l6 B/ E- G. h; X' S: c5 _# Z/ c5 |% j5 H4 W
13.if (newi<=8)&(newj<=8)&(newi>=1)&(newj>=1)&maze(newi,newj)==0
$ T5 T9 s! ^1 @0 ]
' f& C* E4 g) S, I, N8 T. [" v9 b
14.检查新的位置(newi, newj)是否在迷宫范围内且是可行的(即迷宫中的值为0,表示可以走)。" g  A- m; D7 e6 K' ]

* j3 _( C( m+ L
0 d* c" ^6 u1 i7 N15.maze(newi,newj)=3;
& a$ W( z) }" _$ w- Z: b% @3 g% \
  D/ }: n6 P: ]7 d5 U& w
16.将迷宫中新的位置标记为3,表示已经走过。
7 ~5 b: K/ I, K; @+ b3 w  m
" ^. e+ h- P' a+ j# O6 H1 `4 k4 z7 w
17.if newi==8&newj==8
1 A" v1 ~; w# l+ G, @- H
2 P: l" h4 O# D* f8 `! [% q! \
! @  ~$ n$ v7 _$ e. z) ^18.如果新的位置是终点(8, 8),则增加解的数量total,显示当前迷宫maze,并结束递归。
) C* z2 }4 G3 {/ T0 W' C. C- }% m) U# B
  x3 ^! P- c" i
19.total=total+1
4 Y2 b5 e9 b* {0 ^' o* o7 \7 p0 ~$ i/ S
20.增加解的数量。
$ w( u4 k( r/ B" N0 W$ N21.maze' \3 ~6 i. z* E6 a4 I7 J$ g7 _  s

6 Q" n, R, u9 o/ J22.显示当前的迷宫状态。1 G1 X( w1 N' H6 I- w4 k
23.else
& F$ A, e- y! r! [
& S; O( S, R( z; a" W( X) s24.如果新的位置不是终点,执行下面的语句。9 e6 r8 N& j% E+ d4 R0 r
25.[total,maze]=search(newi,newj,maze,total);
0 g  h+ B5 G8 k: O
( {  A6 y$ P+ `& t7 H% N5 ?* h- r26.递归调用search函数,以新的位置(newi, newj)为起点进行搜索。
( ^2 v# z. ^) F9 x27.end
$ Z* V, M) I6 n3 [* A7 N+ t
& {- Y' U; P/ j) {  g+ W3 D- Z& {28.结束if语句。
$ k6 k8 k6 a$ e. L% z29.end. O& v$ v0 {# m* y0 X# r

" H, E, k! h  g1 ~" e30.结束for循环。
$ w1 @  \4 O9 e6 _' u/ a31.maze(i,j)=2;
7 _, u0 `+ ^  M. |6 K/ z9 p
4 H& W  m  @6 T9 u: N$ T32.如果所有可能的移动都被尝试过,将当前位置标记为2,表示当前路径是死路。# l/ b. t7 F6 h/ u
33.end
( W1 @1 K% e# T- T# k, N
8 u# J1 o9 D& J- Q  x+ ]2 \4 b34.结束search函数。
+ ^  k% C8 a0 F9 o6 M" w7 M0 z35.clear all
! s3 Z# E* K, l- E$ R  R: n
! H8 {" s" \! s( p36.清除工作区中的所有变量。$ S/ f7 E* `3 X. t8 y
37.clc6 d6 S! t* w5 u. N
2 @1 |# {6 K- ~
38.清空命令窗口。
0 }9 V+ v# j/ K39.定义了一个8x8的迷宫maze,其中0表示路,1表示墙。
* P3 _8 Y2 ~( U6 ]7 f40.total=0;
7 p" j" n& k& ?- ]6 L$ i  |
0 k# J; t& K3 X3 v3 V: L41.初始化解的数量。+ L2 t5 m4 y# l) Z1 {; b2 G% x
42.maze(1,1)=3;" c  l' \9 b3 v: v$ t' \+ s. H

- X9 G0 X  a9 l! I- s/ W5 T& s43.将起始位置标记为3,表示已经走过。
- J! I$ ?. }( ?, t7 E3 d: I44.[total,maze]=search(1,1,maze,total);' V, x# `, W4 Z+ l. x7 B4 X; p
5 }: `0 i% v& n4 b6 x. J
45.调用search函数开始深度优先搜索。
. i2 @1 |, I8 p0 r  O# p
: [! u) T' c& O8 P5 p/ A+ `整个过程是通过递归实现深度优先搜索,尝试从起始位置到达终点,并记录所有可能的解。在搜索过程中,迷宫中的可行路径被标记为3,死路被标记为2。搜索结束后,会显示解的数量和每个解对应的迷宫状态。
; d$ |+ C) L# M& f2 L' D4 I1 c, n4 j0 I$ R% x
5 T  s- y- o6 I( ]
( Q, v5 Q5 Y& I+ z8 p1 `3 I, o4 m
8 G) F* p8 a4 w

( v; ?+ u- c8 {4 D5 f& h+ g% |# o  K- _7 K" r

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

回顶部