程式語言 - LeetCode - C++ - 417. Pacific Atlantic Water Flow



參考資訊:
https://www.cnblogs.com/grandyang/p/5962508.html

題目:


解答:

class Solution {
public:
    vector<vector<int>> pacificAtlantic(vector<vector<int>>& heights) {
        int m = heights.size();
        int n = heights[0].size();
        vector<vector<bool>> pacific(m, vector<bool>(n, false));
        vector<vector<bool>> atlantic(m, vector<bool>(n, false));

        auto dfs = [&](this auto&& dfs, vector<vector<bool>>& visited, int pre, int i, int j) {
            if (i < 0 || i >= m || j < 0 || j >= n || visited[i][j] || pre > heights[i][j]) {
                return;
            }

            visited[i][j] = true;
            dfs(visited, heights[i][j], i + 1, j + 0);
            dfs(visited, heights[i][j], i - 1, j + 0);
            dfs(visited, heights[i][j], i + 0, j - 1);
            dfs(visited, heights[i][j], i + 0, j + 1);
        };

        for (int i = 0; i < m; ++i) {
            dfs(pacific, INT_MIN, i, 0);
            dfs(atlantic, INT_MIN, i, n - 1);
        }
        for (int i = 0; i < n; ++i) {
            dfs(pacific, INT_MIN, 0, i);
            dfs(atlantic, INT_MIN, m - 1, i);
        }

        vector<vector<int>> ans;
        for (int i = 0; i < m; ++i) {
            for (int j = 0; j < n; ++j) {
                if (pacific[i][j] && atlantic[i][j]) {
                    ans.push_back({ i, j });
                }
            }
        }

        return ans;
    }
};