leecode417.太平洋大西洋水流问题
由海洋逆推回到经过的坐标,用dfs方式将海洋逆推回去的坐标都设置为true,那么只要这个坐标能被太平洋和大西洋逆推为true,那么就添加到结果集中
class Solution {
private:
void pacificAtlantic(vector<vector<int>>& heights,vector<vector<bool>>& visited,int x,int y){
if(visited[x][y])
return;
else{
visited[x][y]=true;
if(y+1<heights[0].size()&&heights[x][y+1]>=heights[x][y])
pacificAtlantic(heights,visited,x,y+1);
if(x+1<heights.size()&&heights[x+1][y]>=heights[x][y])
pacificAtlantic(heights,visited,x+1,y);
if(y-1>=0&&heights[x][y-1]>=heights[x][y])
pacificAtlantic(heights,visited,x,y-1);
if(x-1>=0&&heights[x-1][y]>=heights[x][y])
pacificAtlantic(heights,visited,x-1,y);
}
}
public:
vector<vector<int>> pacificAtlantic(vector<vector<int>>& heights) {
vector<vector<int>> result;
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));
//分别将太平洋可达的坐标和大西洋可达的坐标都设置为true
for(int i=0;i<m;i++){
pacificAtlantic(heights,pacific,i,0);
pacificAtlantic(heights,atlantic,i,n-1);
}
for(int i=0;i<n;i++){
pacificAtlantic(heights,pacific,0,i);
pacificAtlantic(heights,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])
result.push_back({i,j});
return result;
}
};