1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192 |
- func updateBoard(board [][]byte, click []int) [][]byte {
- y, x := click[0], click[1]
- if board[y][x] != 'E' {
- if board[y][x] == 'M' {
- board[y][x] = 'X'
- }
- return board
- }
- m, n := len(board), len(board[0])
- count := make([][]int, m)
- for i := range count {
- count[i] = make([]int, n)
- }
- cntAllMines(board, m, n, count)
- dfs(board, m, n, count, y, x)
- return board
- }
- func dfs(board [][]byte, m, n int, count [][]int, y, x int) {
- if count[y][x] == 0 {
- board[y][x] = 'B'
- for dy := -1; dy <= 1; dy++ {
- for dx := -1; dx <= 1; dx++ {
- ny, nx := y+dy, x+dx
- if 0 <= ny && ny < m && 0 <= nx && nx < n && board[ny][nx] == 'E' {
- dfs(board, m, n, count, ny, nx)
- }
- }
- }
- } else {
- board[y][x] = byte(count[y][x] + '0')
- }
- }
- func cntAllMines(board [][]byte, m, n int, count [][]int) {
- for y := 0; y < m; y++ {
- for x := 0; x < n; x++ {
- if board[y][x] == 'M' {
- for dy := -1; dy <= 1; dy++ {
- for dx := -1; dx <= 1; dx++ {
- ny, nx := y+dy, x+dx
- if 0 <= ny && ny < m && 0 <= nx && nx < n {
- count[ny][nx]++
- }
- }
- }
- }
- }
- }
- }
- func updateBoardMLE(board [][]byte, click []int) [][]byte { // BFS, MLE
- y, x, m, n := click[0], click[1], len(board), len(board[0])
- if board[y][x] != 'E' {
- if board[y][x] == 'M' {
- board[y][x] = 'X'
- }
- return board
- }
- queue := [][]int{[]int{y, x}}
- for len(queue) != 0 {
- y, x = queue[0][0], queue[0][1]
- queue = queue[1:]
- cnt := cntMines(board, m, n, y, x)
- if cnt == 0 {
- board[y][x] = 'B'
- for dy := -1; dy <= 1; dy++ {
- for dx := -1; dx <= 1; dx++ {
- ny, nx := y+dy, x+dx
- if 0 <= ny && ny < m && 0 <= nx && nx < n && board[ny][nx] == 'E' {
- queue = append(queue, []int{ny, nx})
- }
- }
- }
- } else {
- board[y][x] = byte(cnt + '0')
- }
- }
- return board
- }
- func cntMines(board [][]byte, m, n, y, x int) (cnt int) {
- for dy := -1; dy <= 1; dy++ {
- for dx := -1; dx <= 1; dx++ {
- ny, nx := y+dy, x+dx
- if 0 <= ny && ny < m && 0 <= nx && nx < n && board[ny][nx] == 'M' {
- cnt++
- }
- }
- }
- return
- }
|