542.01-matrix.go 1.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253
  1. var dy []int = []int{0, 1, 0, -1}
  2. var dx []int = []int{1, 0, -1, 0}
  3. type pair struct {
  4. _1 int
  5. _2 int
  6. }
  7. func updateMatrix(matrix [][]int) [][]int {
  8. m := len(matrix)
  9. if m == 0 {
  10. return matrix
  11. }
  12. n := len(matrix[0])
  13. if n == 0 {
  14. return matrix
  15. }
  16. updated := make([][]bool, m)
  17. for i := range updated {
  18. updated[i] = make([]bool, n)
  19. }
  20. queue := make([]pair, 0)
  21. for y := 0; y < m; y++ {
  22. for x := 0; x < n; x++ {
  23. if matrix[y][x] == 0 {
  24. updated[y][x] = true
  25. continue
  26. }
  27. for i := 0; i < 4; i++ {
  28. ny, nx := y+dy[i], x+dx[i]
  29. if 0 <= ny && ny < m && 0 <= nx && nx < n && matrix[ny][nx] == 0 {
  30. updated[y][x] = true
  31. queue = append(queue, pair{y, x})
  32. break
  33. }
  34. }
  35. }
  36. }
  37. for len(queue) != 0 {
  38. p := queue[0]
  39. queue = queue[1:]
  40. val := matrix[p._1][p._2]
  41. for i := 0; i < 4; i++ {
  42. ny, nx := p._1+dy[i], p._2+dx[i]
  43. if 0 <= ny && ny < m && 0 <= nx && nx < n && !updated[ny][nx] {
  44. updated[ny][nx] = true
  45. queue = append(queue, pair{ny, nx})
  46. matrix[ny][nx] = val + 1
  47. }
  48. }
  49. }
  50. return matrix
  51. }