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

Posted qinqin-me

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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 };

以上是关于DFS(深度优先搜索遍历有向图)-03-有向图-太平洋大西洋水流问题的主要内容,如果未能解决你的问题,请参考以下文章

深度优先搜索和广度优先搜索的简单对比

深度优先(DFS)与广度优先搜索(BFS)递归版与非递归版

深度优先遍历(DFS)和广度优先遍历(BFS)

图的深度优先遍历DFS和广度优先遍历BFS(邻接矩阵存储)超详细完整代码进阶版

已知一个有向图如图,请分别写出从顶点a出发进行深度优先遍历和广度优先遍历所得到的顶点序列及生成树。

图的基本算法(BFS和DFS)