leetcode-dfs-417. 太平洋大西洋水流问题

 

解析参考:

https://leetcode-cn.com/problems/pacific-atlantic-water-flow/solution/shui-wang-gao-chu-liu-by-xiaohu9527-xxsx/

class Solution {
public:
    vector<vector<bool>> P, A; 
    vector<vector<int>> res;  // 保存结果
    vector<vector<int>> pacificAtlantic(vector<vector<int>>& heights) {
        int m = heights.size();
        int n = heights[0].size();
        
        P = vector<vector<bool>>(m, vector<bool>(n, 0));  // 学到1招,可以这样定义全局变量
        A = vector<vector<bool>>(m, vector<bool>(n, 0));
        // vector<vector<bool>> P(m,vector<bool>(n,false));  // 保存太平洋访问记录
        // vector<vector<bool>> A(m,vector<bool>(n,false));  // 保存大西洋访问记录
        // 左边界和上边界肯定可以访问太平洋
        // 右边界和下边界肯定可以访问大西洋
        // 从边界出发,逆流而上,最后重合的地方就是结果
        for(int i = 0; i < m; i++){
            dfs(heights,P,i,0);  // 左边
            dfs(heights,A,i,n-1);  // 右边
        }
        for(int i = 0; i < n; i++){
            dfs(heights,P,0,i);  // 上边
            dfs(heights,A,m-1,i);  // 下边
        }
        return res;

    }

    void dfs(vector<vector<int>>& heights, vector<vector<bool>>& visited,int i, int j){
        int m = heights.size();
        int n = heights[0].size();
        if(visited[i][j]) // 说明访问过,直接返回
            return;
        visited[i][j] = true; // 如果没有访问过,标记为true,为访问过
        // P[i][j]和A[i][j]为true说明太平洋和大西洋都能通过逆流而上到达这个节点
        // 反之,这个节点也能从两遍顺流如大洋中。
        if(P[i][j]&&A[i][j]) 
            res.push_back({i,j});
        if(i-1>=0&&heights[i-1][j]>=heights[i][j]) dfs(heights,visited,i-1,j);
        if(i+1<m&&heights[i+1][j]>=heights[i][j]) dfs(heights,visited,i+1,j);
        if(j-1>=0&&heights[i][j-1]>=heights[i][j]) dfs(heights,visited,i,j-1);
        if(j+1<n&&heights[i][j+1]>=heights[i][j]) dfs(heights,visited,i,j+1);

    }
};

 

posted @ 2021-08-12 16:44  三一一一317  阅读(53)  评论(0)    收藏  举报