• DFS(深度优先搜索遍历有向图)-03-有向图-太平洋大西洋水流问题


    给定一个 m x n 的非负整数矩阵来表示一片大陆上各个单元格的高度。“太平洋”处于大陆的左边界和上边界,而“大西洋”处于大陆的右边界和下边界。

    规定水流只能按照上、下、左、右四个方向流动,且只能从高到低或者在同等高度上流动。

    请找出那些水流既可以流动到“太平洋”,又能流动到“大西洋”的陆地单元的坐标。

    提示:

    输出坐标的顺序不重要
    m 和 n 都小于150

    示例:

    给定下面的 5x5 矩阵:

    太平洋 ~ ~ ~ ~ ~
    ~ 1 2 2 3 (5) *
    ~ 3 2 3 (4) (4) *
    ~ 2 4 (5) 3 1 *
    ~ (6) (7) 1 4 5 *
    ~ (5) 1 1 2 4 *
    * * * * * 大西洋

    返回:

    [[0, 4], [1, 3], [1, 4], [2, 2], [3, 0], [3, 1], [4, 0]] (上图中带括号的单元).

     1 class Solution {
     2 public:
     3     vector<bool> dfs1(vector<vector<int> >& matrix,vector<vector<int> >&sign,vector<vector<vector<int>> >&sig,vector<bool>& num,int i,int j,int ROM,int COL){
     4         sign[i][j] = 1;
     5         if(i == 0 || j == 0){num[0] = true;}
     8         if(i == ROM - 1 || j == COL - 1){num[1] = true;}
    11         if(sig[i][j][0] != -1&&sig[i][j][1]!= -1){
    12             if(sig[i][j][0] == 1){num[0] = true;}
    15             if(sig[i][j][1] == 1){num[1] = true;}
    18             return num;
    19         }
    20         if(num[0]&&num[1]){return num;}
    23         int value = matrix[i][j];
    24         if(i != 0){
    25             if(value >= matrix[i - 1][j]&&!sign[i - 1][j]){
    26                 num = dfs1(matrix,sign,sig,num,i-1,j,ROM,COL);
    27             }
    28         }
    29         if(j != 0){
    30             if(value >= matrix[i][j - 1]&&!sign[i][j - 1]){
    31                 num = dfs1(matrix,sign,sig,num,i,j - 1,ROM,COL);
    32             }
    33         }
    34         if(i != ROM - 1){
    35             if(value >= matrix[i + 1][j]&&!sign[i + 1][j]){
    36                 num = dfs1(matrix,sign,sig,num,i + 1,j,ROM,COL);
    37             }
    38         }
    39         if(j != COL - 1){
    40             if(value >= matrix[i][j+1]&&sign[i][j+1] == 0){
    41                 num = dfs1(matrix,sign,sig,num,i,j+1,ROM,COL);
    42             }
    43         }
    44         return num;
    45     }
    46     vector<vector<int> > pacificAtlantic(vector<vector<int> >& matrix) {
    47         if(matrix.empty()){return matrix;}
    50         int COL = matrix[0].size();
    51         int ROM = matrix.size();
    52         vector<vector<int> >result;
    53         vector<vector<int> >sign1(ROM,vector<int>(COL,0));
    54         vector<vector<int> >sign;
    55         vector<vector<vector<int> > >sig(ROM,vector<vector<int> >(COL,vector<int>(2,-1)));
    56         vector<bool> zz(2,false);
    57         for(int i = ROM - 1;i >= 0;i--){
    58             for(int j = 0;j < COL;j++){
    59                 sign =sign1;
    60                 zz = dfs1(matrix,sign,sig,zz,i,j,ROM,COL);
    61                 if(zz[0]){
    62                     sig[i][j][0] = 1; 
    63                     if(zz[1]){
    64                         sig[i][j][1] = 1;
    65                         result.push_back({i,j});
    66                     }
    67                     else{sig[i][j][1] = 0;}
    70                 }
    71                 else{
    72                     sig[i][j][0] = 0;
    73                     if(zz[1]){
    74                         sig[i][j][1] = 1;
    75                     }
    76                     else{
    77                         sig[i][j][1] = 0;
    78                     }
    79                 }
    80                 zz[0] = false;zz[1] = false;
    81             }
    82         }
    83         return result;
    84     }
    85 };
  • 相关阅读:
    OpenStack 数据库操作 demo
    python 实现获取电脑IP、主机名、Mac地址
    openvswitch BFD 简介
    Python 获取主机名
    OpenvSwitch完全使用手册
    ovs datapath笔记
    openstack 实用命令
    表示数值的字符串 牛客网 剑指Offer
    反转单词顺序列 牛客网 剑指Offer
    第一个只出现一次字符的位置 牛客网 剑指Offer
  • 原文地址:https://www.cnblogs.com/qinqin-me/p/12104109.html
Copyright © 2020-2023  润新知