• poj3984迷宫问题(dfs+stack)


    迷宫问题
    Time Limit: 1000MS   Memory Limit: 65536K
    Total Submissions: 35426   Accepted: 20088

    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)
    题意:给出一个迷宫矩阵,输出一条通路
    题解:dfs找到一条通路,并用栈记录(poj用万能头文件会CE emmmm)
     1 #include<cstdio>
     2 #include<cstring>
     3 #include<string>
     4 #include<cmath>
     5 #include<iostream>
     6 #include<algorithm>
     7 #include<map>
     8 #include<set>
     9 #include<queue>
    10 #include<vector>
    11 #include<stack>
    12 using namespace std;
    13 int a[20][20];
    14 const int n=5;
    15 stack <pair<int,int> >stk;
    16 bool dfs(int i,int j) {
    17     if(i==n-1&&j==n-1) {
    18         stk.push(make_pair(i,j));
    19         return true;
    20     }
    21     if (i >= 0 && i <= n - 1 && j >= 0 && j <= n - 1) { // 判断边界
    22         if (a[i][j] == 0) { // 可以走且没走过
    23             a[i][j] = 1;// 表示走过
    24             if (dfs(i, j + 1) || dfs(i + 1, j) || dfs(i, j - 1) || dfs(i - 1, j)) { // 接着走
    25                 stk.push(make_pair(i,j));
    26                 return true;
    27             } else { // 回溯
    28                 a[i][j] = 0;
    29                 return false;
    30             }
    31         } else {
    32             return false;
    33         }
    34     } else {
    35         return false;
    36     }
    37 }
    38 int main() {
    39     for(int i=0; i<5; i++) {
    40         for(int j=0; j<5; j++) {
    41             scanf("%d",&a[i][j]);
    42         }
    43     }
    44     dfs(0,0);
    45     while(!stk.empty()) {
    46         printf("(%d, %d)
    ",stk.top().first,stk.top().second);
    47         stk.pop();
    48     }
    49     return 0;
    50 }


  • 相关阅读:
    软件工程概论通读第二章
    软件工程概论通读第一章
    mac 下安装mongodb
    angular5 ng-content使用方法
    angular5 @viewChild @ContentChild ElementRef renderer2
    关于日期的一篇很好的文章
    angular5 组件之间监听传值变化
    angular5 ng-bootstrap和ngx-bootstrap区别
    angular5表单验证问题
    angular5 路由变化监听
  • 原文地址:https://www.cnblogs.com/fqfzs/p/9883770.html
Copyright © 2020-2023  润新知