417.pacific-atlantic-water-flow.go 970 B

12345678910111213141516171819202122232425262728293031323334353637383940414243
  1. var dx []int = []int{1, 0, -1, 0}
  2. var dy []int = []int{0, -1, 0, 1}
  3. func pacificAtlantic(matrix [][]int) (res [][]int) {
  4. m := len(matrix)
  5. if m == 0 {
  6. return
  7. }
  8. n := len(matrix[0])
  9. if n == 0 {
  10. return
  11. }
  12. ocean := make([][]int, m)
  13. for i := 0; i < m; i++ {
  14. ocean[i] = make([]int, n)
  15. }
  16. for i := 0; i < m; i++ { // b10: pacific, b01: atlantic
  17. dfs(matrix, 2, 0, i, ocean, m, n)
  18. dfs(matrix, 1, n-1, i, ocean, m, n)
  19. }
  20. for i := 0; i < n; i++ {
  21. dfs(matrix, 2, i, 0, ocean, m, n)
  22. dfs(matrix, 1, i, m-1, ocean, m, n)
  23. }
  24. for i := 0; i < m; i++ {
  25. for j := 0; j < n; j++ {
  26. if ocean[i][j] == 3 {
  27. res = append(res, []int{i, j})
  28. }
  29. }
  30. }
  31. return
  32. }
  33. func dfs(matrix [][]int, mask, x, y int, ocean [][]int, m, n int) {
  34. ocean[y][x] |= mask
  35. for i := 0; i < 4; i++ {
  36. nx, ny := x+dx[i], y+dy[i]
  37. if 0 <= nx && nx < n && 0 <= ny && ny < m && ocean[ny][nx]&mask == 0 && matrix[y][x] <= matrix[ny][nx] {
  38. dfs(matrix, mask, nx, ny, ocean, m, n)
  39. }
  40. }
  41. }