class Solution {
public:
bool is_get(int x, int y){
if(x >= 0 && x < len_x && y >= 0 && y < len_y)
return true;
return false;
}
int dfs(vector<vector<int>>& heights, vector<vector<int>>& result, vector<vector<bool>>& record, vector<vector<bool>>& is_add, int x, int y, int flag){
if(x == 0 || y == 0)
flag |= 1;
if(x == len_x - 1 || y == len_y - 1)
flag |= 2;
record[x][y] = true;
for(int i=0;i<4;++i){
int target_x = x + dir[i][0];
int target_y = y + dir[i][1];
if(is_get(target_x, target_y)
&& record[target_x][target_y] == false){
if(heights[x][y] >= heights[target_x][target_y]){
if (is_add[target_x][target_y]){
flag = 3;
break;
}
flag = flag | dfs(heights, result, record, is_add, target_x, target_y, 0);
}
}
}
if(!is_add[x][y] && flag == 3){
is_add[x][y] = true;
result.push_back({x , y});
}
record[x][y] = false;
return flag;
}
vector<vector<int>> pacificAtlantic(vector<vector<int>>& heights) {
len_x = heights.size();
len_y = heights[0].size();
vector<vector<int>> result;
vector<vector<bool>> is_add(len_x, vector<bool>(len_y, false));
vector<vector<bool>> record(len_x, vector<bool>(len_y, false));
for(int i=0;i<len_x;++i)
for(int j=0;j<len_y;++j){
if(!is_add[i][j])
dfs(heights, result, record, is_add, i, j, 0);
}
return result;
}
private:
int len_x;
int len_y;
int dir[4][2] = {
{1,0},
{-1,0},
{0,1},
{0,-1}
};
};