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

题目:

  给定一个 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暴力大法好!

 

posted @ 2020-02-27 19:55  tangq123  阅读(1133)  评论(0编辑  收藏  举报