lintcode 778. 太平洋和大西洋的水流 dfs

給定一個m×n的非負矩陣代表一個大洲,矩陣的每個單元格的值代表此處的地形高度,矩陣的左邊緣和上邊緣是“太平洋”,下邊緣和右邊緣是“大西洋”。

水流只能在四個方向(上,下,左或右)從一個單元格流向另一個海拔和自己相等或比自己低的單元格。

找到那些從此處出發的水既可以流到“太平洋”,又可以流向“大西洋”的單元格的座標。

樣例
例1:

輸入:
matrix = 
[[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]]
解釋:
Pacific ~ ~ ~ ~ ~
      ~ 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 *
        * * * * * Atlantic
例2:

輸入:
matrix =
[[1,2],
[4,3]]
輸出:
[[0,1],[1,0],[1,1]]
注意事項
返回的滿足條件的座標的任意一種排列即可。
n, m <= 150
class Solution {
public:
    /**
     * @param matrix: the given matrix
     * @return: The list of grid coordinates
     */
    vector<vector<int>> pacificAtlantic(vector<vector<int>> &matrix) {
        // write your code here
        vector<vector<int>>res;
        int m=matrix.size();
        if(m==0) return res;
        int n=matrix[0].size();
        if(n==0) return res;
        vector<vector<bool>>pacific(m,vector<bool>(n,false));
        vector<vector<bool>>Atlantic(m,vector<bool>(n,false));
        for (int i = 0; i < m; i++) {
            dfs(matrix,pacific,i,0);
            dfs(matrix,Atlantic,i,n-1);
        }
        for(int i = 0; i < n; i++)
        {
            dfs(matrix,pacific,0,i);
            dfs(matrix,Atlantic,m-1,i);
        }
        for (int i = 0; i < m; i++) {
            for(int j = 0; j < n ;j++)
            {
                if(pacific[i][j]&&Atlantic[i][j])
                {
                    vector<int>tmp;
                    tmp.push_back(i);
                    tmp.push_back(j);
                    res.push_back(tmp);
                }
            }
        }
        return res;
    }
    void dfs(const vector<vector<int>> &matrix,vector<vector<bool>> &visit,int row,int col)
    {
        if(row<0||col<0||row>=matrix.size()||col>=matrix[0].size()||visit[row][col]) return;
        visit[row][col]=true;
        if(row-1>=0&&matrix[row][col]<=matrix[row-1][col])
            dfs(matrix,visit,row-1,col);
        if(row+1<matrix.size()&&matrix[row][col]<=matrix[row+1][col])
            dfs(matrix,visit,row+1,col);
        if(col-1>=0&&matrix[row][col]<=matrix[row][col-1])
            dfs(matrix,visit,row,col-1);
        if(col+1<matrix[0].size()&&matrix[row][col]<=matrix[row][col+1])
            dfs(matrix,visit,row,col+1);
    }
    
};
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章