# Watershed Divide
As know as [Pacific Atlantic Waterflow](https://leetcode.com/problems/pacific-atlantic-water-flow/)
Intuition: take the reverse approach, start from the shores and go up. Both [[bfs|BFS]] and [[dfs|DFS]] should work.
```python
m, n = len(heights), len(heights[0])
watershed_p = [[False for _ in range(n)] for _ in range(m)]
watershed_a = deepcopy(watershed_p)
def dfs(r, c, watershed) -> None:
if watershed[r][c]:
return
watershed[r][c] = True
offsets = [(0, 1), (1, 0), (-1, 0), (0, -1)]
for r_offset, c_offset in offsets:
new_r, new_c = r + r_offset, c + c_offset
if (
0 <= new_r < m and 0 <= new_c < n and
heights[new_r][new_c] >= heights[r][c]
):
dfs(new_r, new_c, watershed)
shore_p = [(0, c) for c in range(n)] + [(r, 0) for r in range(m)]
shore_a = [(m - 1, c) for c in range(n)] + [(r, n - 1) for r in range(m)]
for r, c in shore_p:
dfs(r, c, watershed_p)
for r, c in shore_a:
dfs(r, c, watershed_a)
return [
(r, c)
for r, c in product(range(m), range(n))
if watershed_p[r][c] and watershed_a[r][c]
]
```