529.minesweeper.go 2.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192
  1. func updateBoard(board [][]byte, click []int) [][]byte {
  2. y, x := click[0], click[1]
  3. if board[y][x] != 'E' {
  4. if board[y][x] == 'M' {
  5. board[y][x] = 'X'
  6. }
  7. return board
  8. }
  9. m, n := len(board), len(board[0])
  10. count := make([][]int, m)
  11. for i := range count {
  12. count[i] = make([]int, n)
  13. }
  14. cntAllMines(board, m, n, count)
  15. dfs(board, m, n, count, y, x)
  16. return board
  17. }
  18. func dfs(board [][]byte, m, n int, count [][]int, y, x int) {
  19. if count[y][x] == 0 {
  20. board[y][x] = 'B'
  21. for dy := -1; dy <= 1; dy++ {
  22. for dx := -1; dx <= 1; dx++ {
  23. ny, nx := y+dy, x+dx
  24. if 0 <= ny && ny < m && 0 <= nx && nx < n && board[ny][nx] == 'E' {
  25. dfs(board, m, n, count, ny, nx)
  26. }
  27. }
  28. }
  29. } else {
  30. board[y][x] = byte(count[y][x] + '0')
  31. }
  32. }
  33. func cntAllMines(board [][]byte, m, n int, count [][]int) {
  34. for y := 0; y < m; y++ {
  35. for x := 0; x < n; x++ {
  36. if board[y][x] == 'M' {
  37. for dy := -1; dy <= 1; dy++ {
  38. for dx := -1; dx <= 1; dx++ {
  39. ny, nx := y+dy, x+dx
  40. if 0 <= ny && ny < m && 0 <= nx && nx < n {
  41. count[ny][nx]++
  42. }
  43. }
  44. }
  45. }
  46. }
  47. }
  48. }
  49. func updateBoardMLE(board [][]byte, click []int) [][]byte { // BFS, MLE
  50. y, x, m, n := click[0], click[1], len(board), len(board[0])
  51. if board[y][x] != 'E' {
  52. if board[y][x] == 'M' {
  53. board[y][x] = 'X'
  54. }
  55. return board
  56. }
  57. queue := [][]int{[]int{y, x}}
  58. for len(queue) != 0 {
  59. y, x = queue[0][0], queue[0][1]
  60. queue = queue[1:]
  61. cnt := cntMines(board, m, n, y, x)
  62. if cnt == 0 {
  63. board[y][x] = 'B'
  64. for dy := -1; dy <= 1; dy++ {
  65. for dx := -1; dx <= 1; dx++ {
  66. ny, nx := y+dy, x+dx
  67. if 0 <= ny && ny < m && 0 <= nx && nx < n && board[ny][nx] == 'E' {
  68. queue = append(queue, []int{ny, nx})
  69. }
  70. }
  71. }
  72. } else {
  73. board[y][x] = byte(cnt + '0')
  74. }
  75. }
  76. return board
  77. }
  78. func cntMines(board [][]byte, m, n, y, x int) (cnt int) {
  79. for dy := -1; dy <= 1; dy++ {
  80. for dx := -1; dx <= 1; dx++ {
  81. ny, nx := y+dy, x+dx
  82. if 0 <= ny && ny < m && 0 <= nx && nx < n && board[ny][nx] == 'M' {
  83. cnt++
  84. }
  85. }
  86. }
  87. return
  88. }