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(邻接矩阵存储)超详细完整代码进阶版