首页 > 其他 > 详细

深度优先搜索---迷宫问题(最短路径长度)

时间:2020-02-27 21:39:35      阅读:94      评论:0      收藏:0      [点我收藏+]

题目:

  给定一个 n x m大小的迷宫,其中 “*” 代表不可通过的墙壁,而 ’.‘代表平地,S表示起点,T表示终点。移动过程中,如果当前位置是(x,y)(下标从0开始),且每次只能往上下左右四个方向的平地移动,求从起点S到达终点T的最少步数

.....

.*.*.

.*S*.

.***.

...T*

在上面的样例中,S的坐标为(2,2),T的坐标为(4,3)。

输入格式:

 第一行给出m,n,表示迷宫的行,列;

 下面每一行给出 n个字符,共 m行;

最后一行给出起点坐标S1,S2,终点坐标T1,T2。

输出格式:

输出从起点S到达终点T的最少步数, 不存在输出 -1。

输入样例 1:

5 5 

.....

.*.*.

.*S*.

.***.

...T*

2 2 4 3

输出样例 1:

11

输入样例 2:

5 5

.....

.*.*.

.*S*.

.***.

...T.

2 2 4 3

输出样例 2:

9

 1 #include<iostream>
 2 #include<algorithm>
 3 using namespace std;
 4 
 5 const int maxn = 30;
 6 int m,n,MIN = 0x3fffffff;
 7 int S1,S2,T1,T2;
 8 char maze[maxn][maxn];
 9 
10 void DFS(int i,int j,int length) {
11     if(i < 0 || j < 0 || i>= m || j>= n || maze[i][j] == *)//下标不能越过矩阵边界,或者碰到障碍物 ---递归边界
12         return ;
13     if(i == T1 && j == T2) {
14         MIN = min(MIN,length);//到达终点,更新最短路径长度
15         return ;
16     }
17     maze[i][j] = *;//四个方向作为选择分支 
18     DFS(i,j+1,length +1);
19     DFS(i,j-1,length +1);
20     DFS(i+1,j,length +1);
21     DFS(i-1,j,length +1);
22     maze[i][j] = .;//四个方向都找完了,由“*”恢复“.”,退回上一步 
23 }
24 
25 int main() {
26     cin>>m>>n;
27     for(int i = 0; i < m; ++i) {//初始化迷宫
28         for(int j = 0; j < n; ++j)
29             cin>>maze[i][j];
30     }
31     cin>>S1>>S2>>T1>>T2;//起点(S1,S2)和终点(T1,T2)
32     DFS(S1,S2,0);
33     cout<<MIN;
34     return 0;
35 }

运行结果 1:

技术分享图片

 

 运行结果 2:

 技术分享图片

运行结果 3:

技术分享图片

 ps:DFS暴力大法好!

 

深度优先搜索---迷宫问题(最短路径长度)

原文:https://www.cnblogs.com/keep23456/p/12373651.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!