QQ登录

只需要一步,快速开始

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

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

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

1186

主题

4

听众

2922

积分

该用户从未签到

跳转到指定楼层
1#
发表于 2023-12-22 17:11 |只看该作者 |倒序浏览
|招呼Ta 关注Ta
为大家分享一个代码,该代码是使用升读优先搜索解决迷宫难题
9 j5 c# n3 O( F  F+ ]8 K3 p$ e  P! b, l. [6 S* K' u" ~
当调用[total,maze]=search(1,1,maze,total);时,会从(1, 1)这个位置开始,在给定的迷宫maze上执行深度优先搜索。下面是对代码的逐行解释:0 T, }* Z; O+ E$ S

2 s" _9 q& I) I, U6 }0 D1 Q) ^6 y1.function [total,maze]=search(i,j,maze,total);2 K0 ^7 ?3 _( E$ ~

7 C% L+ E6 K* \" F. h( `
8 M' Q/ ]2 c5 w- U. R2.定义了一个函数search,该函数接受当前位置(i, j)、迷宫maze和解的数量total作为输入参数,并返回更新后的total和maze。
7 D) j( T2 v) ^7 ]
. E+ T3 p& g7 F+ w& R2 ?
$ `( C) G, O2 {2 b) B3.fx(1:4)=[0,1,-1,0];
- Q) }* y! V; O- _0 R7 J, E  E$ s  S6 m7 W1 {
. u$ n$ e* {. i
4.定义了一个包含四个元素的数组fx,表示在行方向上的四个可能的移动。
7 g3 Z( D$ f) i$ w* a$ F6 A# s# Z6 C" N( u

$ O2 M4 w+ @; @3 K5.fy(1:4)=[1,0,0,-1];
/ C3 i; w$ N( w  U8 r  {
1 W- q  L" E( Z1 s: f  A, `+ u
$ A$ E. w; i5 t& @- U/ h! I3 ~6.定义了一个包含四个元素的数组fy,表示在列方向上的四个可能的移动。
1 f% @/ [7 r; u$ M2 _0 G& W' I5 _! n. c8 G

: ^" @2 m1 }$ z7.for k=1:4
4 v- N; m$ H0 a' i. C  P/ f/ d, e* ]1 q

6 w# ~8 E* G( W% z8.开始一个循环,遍历四个可能的移动方向。
1 @# z+ I2 T* v' v( A
# V, N+ ]4 G1 m* I$ G) t  U
8 b9 Y; f  k7 {9.newi=i+fx(k);( b, O8 W& x; B1 G! _/ ^1 o) J% V

5 c& C$ ?3 ]8 V1 l: [% r- d$ |/ o. Y/ P6 I! V
10.根据当前位置(i, j)和移动方向计算新的行坐标newi。* C9 z. Q- O% G, z
& t1 w, _; h4 H+ S1 S
3 x! M7 H5 Y# V1 A6 s0 s
11.newj=j+fy(k);
4 M! V1 b0 }2 n% Y" k. H7 j0 \
, t: f9 j! L; L. C, t5 ~# L: F
& N- q! w7 l- b12.根据当前位置(i, j)和移动方向计算新的列坐标newj。7 V6 h  e0 s* w4 |" _, F3 j2 v6 B
3 |1 L+ m/ H# p
4 j: K7 J9 E0 Q" M9 z. A. d. [. u$ F
13.if (newi<=8)&(newj<=8)&(newi>=1)&(newj>=1)&maze(newi,newj)==05 Y& h8 q  T  R' w: I0 D8 v2 p

9 i) K5 _- W1 P/ R; R9 v. U
( i% x3 S$ ]4 g1 X  k7 ^( w* n14.检查新的位置(newi, newj)是否在迷宫范围内且是可行的(即迷宫中的值为0,表示可以走)。
1 m! D. [. P" W8 s# g- b# _- u6 U7 A& t' D% Q: r

$ K- g. m; h) R( f15.maze(newi,newj)=3;
$ s0 |- G% O1 r
' N% k9 B% r: z& Z) r( V
$ S% L9 D! q9 b16.将迷宫中新的位置标记为3,表示已经走过。
. q9 Z( G! Y+ I' K$ |! [( F- V2 ?  e+ T) X, d4 ^" V9 C

+ \/ f( C# S  O: @17.if newi==8&newj==8
4 c1 g% C3 u2 |' a
! }2 m3 n  y, k( _9 @
! p: k6 ]1 \. W& L5 k18.如果新的位置是终点(8, 8),则增加解的数量total,显示当前迷宫maze,并结束递归。; A2 I+ n* Y( `+ e" L

& o9 ^4 d. A: F2 c' w+ M& Y/ N& {3 p9 F* F! [: [
19.total=total+1% r! f, B) q6 X3 J3 K: t2 ^0 q/ O
, Q4 q" g: |! N- d' \" D
20.增加解的数量。0 C  I- Q4 b+ |: f% Z, k. b6 k
21.maze: x' L5 u' f+ p+ x* v1 ?6 x" Y
$ T8 N7 k$ M# x0 k/ o6 \% x
22.显示当前的迷宫状态。
* y3 j5 e, U) \% }6 }4 l, Y5 |2 |9 a5 f23.else
6 C0 G( F: ]% x6 h' ?& X7 K8 M% Y  |: a; M; Y: Y& O
24.如果新的位置不是终点,执行下面的语句。
6 N( W* U# O- q5 j: E3 d25.[total,maze]=search(newi,newj,maze,total);* A6 n( g" n# K5 x; G3 n) p

5 }+ U; @6 W, W0 E26.递归调用search函数,以新的位置(newi, newj)为起点进行搜索。4 r- |5 y7 p7 J: P
27.end' @' r9 C/ Z; b. [
* q9 o2 ?6 l( B
28.结束if语句。2 K: K# o: v! C! N
29.end
9 u" b3 |1 N# F: ^$ {5 a
9 ^; a8 g4 q, s! e4 \' R2 Q30.结束for循环。
3 u/ r5 f7 a. c2 Q* g& X# D; M* n31.maze(i,j)=2;0 x: Z7 F4 {! C8 L
' k; X$ G4 y4 }$ s
32.如果所有可能的移动都被尝试过,将当前位置标记为2,表示当前路径是死路。0 k  j% A* j& Q) g9 Z6 g+ l
33.end
7 P9 F) v9 ^0 L- s6 Z
. r) }$ \, P. G) G9 L34.结束search函数。
8 P: N. o1 `+ V35.clear all5 ^- E1 f- H9 R- l1 _+ J% p
7 m3 Z) g' v7 S/ L5 l* l
36.清除工作区中的所有变量。* @* K  O7 T$ u4 T/ U# q* z& R
37.clc: y4 y" k7 H- o" v! }; N
. H* G8 c4 h! n  H. X
38.清空命令窗口。
" I0 f7 M8 n2 J: g) @8 ^' P39.定义了一个8x8的迷宫maze,其中0表示路,1表示墙。3 A( @1 [: _* G" s# F: C
40.total=0;
( g8 s- q, c# u. J% h( S  L$ s' n5 ~( C
41.初始化解的数量。% X9 @+ a4 P3 K8 k: T* j6 l
42.maze(1,1)=3;5 a) D% k, M4 J8 t! G" C1 `; B
, ?" o& i  q* k6 W2 X; y/ T
43.将起始位置标记为3,表示已经走过。$ \! ?# v) c, S: x, g1 C7 o  j& C
44.[total,maze]=search(1,1,maze,total);
( j* g7 j; D9 o
1 @7 k3 v% |% k5 j1 p# J45.调用search函数开始深度优先搜索。9 j3 f4 a  q; u% [' G
1 `) X; h: F! A8 K; h
整个过程是通过递归实现深度优先搜索,尝试从起始位置到达终点,并记录所有可能的解。在搜索过程中,迷宫中的可行路径被标记为3,死路被标记为2。搜索结束后,会显示解的数量和每个解对应的迷宫状态。2 {9 D3 T' _1 o  ?  ^1 V3 x
. @7 f6 g3 y7 c  n+ B& m8 `
8 _% ~9 {  m* I- m' L
$ M* f# [" E8 E  S$ v
/ b/ s. s& k/ f( _) u6 ?2 _! ^

) g% E" W  x0 Q* g5 t# `# g2 o1 t9 F0 Z0 z

深度优先搜索.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-10 16:40 , Processed in 2.737357 second(s), 55 queries .

回顶部