深度优先搜索---迷宫问题(最短路径长度)
题目:
给定一个 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暴力大法好!