> For the complete documentation index, see [llms.txt](https://chiragjain.gitbook.io/neetcode/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://chiragjain.gitbook.io/neetcode/417-pacific-atlantic-water-flow/code.md).

# CODE

```python
class Solution:
    def pacificAtlantic(self, heights: List[List[int]]) -> List[List[int]]:
        ROWS, COLS = len(heights), len(heights[0])
        pac_plots, atl_plots = set(), set()
        dirs = [(1, 0), (0, 1), (-1, 0), (0, -1)]
        
        def search(r, c, prev_height, plots):
            if not (0 <= r < ROWS) or not (0 <= c < COLS) or (r, c) in plots: return
            if heights[r][c] < prev_height: return
            
            plots.add((r, c))            
            for nr, nc in dirs:
                search(r + nr, c + nc, heights[r][c], plots)
        
        # Get plots which reach atlantic and pacific backwards
        # from verticals
        for r in range(ROWS):
            search(r, 0, -1, pac_plots)
            search(r, COLS - 1, -1, atl_plots)
            
        # Get plots which reach atlantic and pacific backwards
        # from verticals
        for c in range(COLS):
            search(0, c, -1, pac_plots)
            search(ROWS - 1, c, -1, atl_plots)
        
        # Return the set of elements that can be reached 
        # from both pacific and atlantic
        return (pac_plots & atl_plots)
        
```
