POJ 3984(DFS入门题 +stack储存路径)

POJ 3984

Description

定义一个二维数组: 

int maze[5][5] = {
0, 1, 0, 0, 0,
0, 1, 0, 1, 0,
0, 0, 0, 0, 0,
0, 1, 1, 1, 0,
0, 0, 0, 1, 0,
};

它表示一个迷宫,其中的1表示墙壁,0表示可以走的路,只能横着走或竖着走,不能斜着走,要求编程序找出从左上角到右下角的最短路线。

Input

一个5 × 5的二维数组,表示一个迷宫。数据保证有唯一解。

Output

左上角到右下角的最短路径,格式如样例所示。

Sample Input

0 1 0 0 0
0 1 0 1 0
0 0 0 0 0
0 1 1 1 0
0 0 0 1 0

Sample Output

(0, 0)
(1, 0)
(2, 0)
(2, 1)
(2, 2)
(2, 3)
(2, 4)
(3, 4)
(4, 4)

 1 //个人对DFS的体会:通过递归和带调用栈实现了回溯;
 2 //记录路径:不断的调用栈和相继出栈,从后往前的把数据压入栈中;
 3 #include<bits/stdc++.h>  //POJ中使用这个头文件会CE;
 4 using namespace std;
 5 
 6 int n=5;
 7 int a[7][7];
 8 stack<pair<int,int>> stk;
 9 
10 //写DFS函数的时候一定要清晰每一种情况,每一个的循环条件要准确
11 bool DFS(int i, int j)
12 {
13     if(i==n-1&&j==n-1){
14         stk.push(make_pair(i,j));
15         return true;
16     }
17 
18 
19     if(a[i][j]==0&&i>=0&&j>=0&&i<=n-1&&j<=n-1)
20     {
21         a[i][j]=1;     //表示这条路在后面的循环中不会再重复走了;
22         if(DFS(i,j+1)||DFS(i+1,j)){
23             stk.push(make_pair(i,j));
24             return true;
25         }
26         else
27             return false;
28     }
29     return false;
30 
31 }
32 int main()
33 {
34     memset(a, -1, sizeof(a));
35     for(int i=0; i<n; i++)
36         for(int j=0; j<n; j++)
37             cin>>a[i][j];
38 
39     DFS(0,0);
40 
41     while(stk.size()){
42         printf("(%d, %d)
",stk.top().first,stk.top().second);
43         stk.pop();
44     }
45 
46     return 0;
47 }