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 };

原文地址:https://www.cnblogs.com/qinqin-me/p/12104109.html

时间: 2024-08-27 16:58:50

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

数据结构--图--图的数组存储表示,深度优先搜索遍历和广度优先搜索遍历

图有四种存储结构:数组,邻接表,十字链表,邻接多重表.下面以数组为存储结构来实现图的深度优先搜索遍历和广度优先搜索遍历.其中广度优先搜索遍历中有用到STL中的queue,注意头文件的包含.具体代码如下: //图的数组(邻接矩阵)存储表示和深度优先遍历 const int MAX_VERTEX_NUM=20; //最大顶点数 typedef enum {DG,DN,UDG,UDN} GraphKind ;//(有向图,有向网,无向图,无向网) typedef int VRType; typedef

417. 太平洋大西洋水流问题

417. 太平洋大西洋水流问题 题目描述 给定一个 m x n 的非负整数矩阵来表示一片大陆上各个单元格的高度."太平洋"处于大陆的左边界和上边界,而"大西洋"处于大陆的右边界和下边界. 规定水流只能按照上.下.左.右四个方向流动,且只能从高到低或者在同等高度上流动. 请找出那些水流既可以流动到"太平洋",又能流动到"大西洋"的陆地单元的坐标. ? 提示: 输出坐标的顺序不重要 m 和 n 都小于150 ? 示例: ? 给定下

GraphMatrix::DFS深度优先搜索

template <typename Tv, typename Te> //深度优先搜索DFS算法(全图) void Graph<Tv, Te>::dfs(int s) { //assert: 0 <= s < n reset(); int clock = 0; int v = s; //初始化 do //逐一检查所有顶点 if (UNDISCOVERED == status(v)) //一旦遇到尚未发现的顶点 DFS(v, clock); //即从该顶点出发启动一次D

DFS(深度优先搜索)

深度优先搜索算法(Depth-First-Search),是搜索算法的一种.它沿着树的深度遍历树的节点,尽可能深的搜索树的分支.当节点v的所有边都己被探寻过,搜索将回溯到发现节点v的那条边的起始节点.这一过程一直进行到已发现从源节点可达的所有节点为止.如果还存在未被发现的节点, 则选择其中一个作为源节点并重复以上过程,整个进程反复进行直到所有节点都被访问为止.DFS属于盲目搜索. 深度优先搜索是图论中的经典算法,利用深度优先搜索算法可以产生目标图的相应拓扑排序表,利用拓扑排序表可以方便的解决很多

DFS 深度优先搜索例题

约翰的农场被暴风雨给淹没了,损失很大,他的保险公司将支付给他,但是支付金额取决于被淹没的最大面积.这个农场是一个边长分别为n.m的矩形,包含nm个空间,每个空间要么是干的,要么是被淹没的,一共有k个空间被淹没.求最大的淹没面积. 题目分析:首先建立坐标,标记被淹没的空间,然后从左上角搜索被淹没的空间,并取消标记,再以此为中心向四周搜索是否有被淹没的空间,有的话继续计数并取消标记,以此类推,找出所有被淹没的空间,最后排序,找到被淹没最大的面积. #include <stdio.h>#includ

算法导论——DFS深度优先搜索

package org.loda.graph; import org.loda.structure.Stack; /** * * @ClassName: DFS * @Description: 深度优先搜索(无向图) * @author minjun * @date 2015年5月24日 上午4:02:24 * */ public class DFS { //原点 private int s; // visited[i]表示i节点是否被访问过 private boolean[] visited;

回溯 DFS 深度优先搜索[待更新]

首先申明,本文根据微博博友 @JC向北 微博日志 整理得到,本文在这转载已经受作者授权! 1.概念 回溯算法 就是 如果这个节点不满足条件 (比如说已经被访问过了),就回到上一个节点尝试别的路径 也就是说 走到死胡同里边就往回走,直到找到出口. 回溯 是一种 选优搜索 .许多复杂规模较大的问题都可以用 回溯 解决 ,因此回溯法有 "通用解题方法"的美称. 2.思想 若用回溯法求问题的所有解时,要回溯到根,且根结点的所有可行的子树都要已被搜索遍才结束.而 若使用回溯法求任一个解时,只要搜

DFS——深度优先搜索的一般格式

DFS是一种深度优先的搜索思想,运用递归完成搜索,本质上也算是穷举思想的一类,可以通过剪枝进行优化. DFS的核心是回溯和递归, 如果以迷宫为例,一般会指定走各个方向的顺序(例如先左再上再右再下).从起点开始,进入DFS(),判断是否到达终点,再判断四个方向是否可走,如果有路,DFS会进入下一格,并且进行同样的判断,此处运用了递归.当四个方向都没路时,就会回溯到上一个位置,继续判断别的方向. DFS用途十分广泛,例如在以二维数组表示的图中搜索路径,也可以用于别的方面,比如求全排列,此时将每个数字

迷宫生成及深度优先搜索遍历迷宫(OpenGL)

其实以前就写过一个迷宫的程序和DFS遍历,不过弄丢了,前几天闲就重写了一下.欢迎交流和拍砖.有很多不足的地方也希望大家多指正. 迷宫生成的算法来自<计算机图形学>,也就是这本书: 生成迷宫的算法描述如下: 由于表示墙使用了up_wall和left_wall两个矩阵,所以格子的数量要比能显示出来的多一行一列,否则屏幕最下边和最右边是没有墙的.虽然可以后面画上,不过我选择这样. 对于迷宫的遍历使用DFS,另外由于使用了一个visited矩阵表示每个格子是否已经访问过,所以即使迷宫里存在环也没有任何