class Solution {
int m,n;
int[] dx = {0,0,-1,1};
int[] dy = {-1,1,0,0};
public List<List<Integer>> pacificAtlantic(int[][] heights) {
m = heights.length; n = heights[0].length;
boolean[][] pac = new boolean[m][n];
boolean[][] atl = new boolean[m][n];
//判断大西洋的水能否流到某一位置
for(int i = 0; i < n; i++) dfs(heights,0,i,pac);
for(int j = 0; j < m; j++) dfs(heights,j,0,pac);
//判断太平洋的水能否流到某一位置
for(int i = 0; i < m; i++) dfs(heights,i,n-1,atl);
for(int j = 0; j < n; j++) dfs(heights,m-1,j,atl);
List<List<Integer>> ret = new ArrayList<>();
for(int i = 0; i < m; i++)
for(int j = 0; j < n; j++){
if(pac[i][j] && atl[i][j]){
List<Integer> tmp = new ArrayList<>();
tmp.add(i); tmp.add(j);
ret.add(tmp);
}
}
return ret;
}
//封装出来一套标记遍历
private void dfs(int[][] heights, int i, int j, boolean[][] vis){
vis[i][j] = true;
for(int k = 0; k < 4; k++){
int x = i + dx[k]; int y = j + dy[k];
if(x >= 0 && x < m && y >= 0 && y < n && !vis[x][y] && heights[x][y] >= heights[i][j]){
dfs(heights,x,y,vis);
}
}
}
}