POJ 3984(DFS入门题 +stack储存路径)
POJ 3984
Description
定义一个二维数组:
它表示一个迷宫,其中的1表示墙壁,0表示可以走的路,只能横着走或竖着走,不能斜着走,要求编程序找出从左上角到右下角的最短路线。
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)\n",stk.top().first,stk.top().second); 43 stk.pop(); 44 } 45 46 return 0; 47 }