# 0417. Pacific Atlantic Water Flow
###### tags: `Leetcode` `Medium` `DFS` `BFS`
link: https://leetcode.com/problems/pacific-atlantic-water-flow/
## 思路
从海开始做dfs
visited同时也代表能不能到达 所以不能在dfs这个点之前就把它设成visited
## Code
```java=
class Solution {
public List<List<Integer>> pacificAtlantic(int[][] heights) {
int m = heights.length, n = heights[0].length;
boolean[][] pacVisited = new boolean[m][n];
boolean[][] atlVisited = new boolean[m][n];
for(int i=0; i<m; i++){
dfs(heights, pacVisited, -1, i, 0);
dfs(heights, atlVisited, -1, i, n-1);
}
for(int i=0; i<n; i++){
dfs(heights, pacVisited, -1, 0, i);
dfs(heights, atlVisited, -1, m-1, i);
}
List<List<Integer>> ans = new ArrayList<>();
for(int i=0; i<m; i++){
for(int j=0; j<n; j++){
if(pacVisited[i][j] && atlVisited[i][j]){
List<Integer> temp = new ArrayList<>();
temp.add(i);
temp.add(j);
ans.add(temp);
}
}
}
return ans;
}
private void dfs(int[][] heights, boolean[][] visited, int prev, int x, int y){
int[][] dirs = new int[][]{{0,1},{0,-1},{1,0},{-1,0}};
if(x<0 || x>=visited.length || y<0 || y>=visited[0].length || visited[x][y] || prev > heights[x][y]) return;
visited[x][y] = true;
for(int[] dir:dirs){
int nextx = x+dir[0], nexty = y+dir[1];
dfs(heights, visited, heights[x][y], nextx, nexty);
}
}
}
```