diff --git a/leetcode/0529.Minesweeper/529. Minesweeper.go b/leetcode/0529.Minesweeper/529. Minesweeper.go index aef5d2b8..786405ee 100644 --- a/leetcode/0529.Minesweeper/529. Minesweeper.go +++ b/leetcode/0529.Minesweeper/529. Minesweeper.go @@ -16,48 +16,31 @@ func updateBoard(board [][]byte, click []int) [][]byte { board[click[0]][click[1]] = 'X' return board } + dfs(board, click[0], click[1]) + return board +} - mineMap := make([][]int, len(board)) - for i := range board { - mineMap[i] = make([]int, len(board[i])) - } - - for i := range board { - for j := range board[i] { - if board[i][j] == 'M' { - mineMap[i][j] = -1 - for _, d := range dir8 { - nx, ny := i+d[0], j+d[1] - if isInBoard(board, nx, ny) && mineMap[nx][ny] >= 0 { - mineMap[nx][ny]++ - } - } - } +func dfs(board [][]byte, x, y int) { + cnt := 0 + for i := 0; i < 8; i++ { + nx, ny := x+dir8[i][0], y+dir8[i][1] + if isInBoard(board, nx, ny) && board[nx][ny] == 'M' { + cnt++ + } + } + if cnt > 0 { + board[x][y] = byte(cnt + '0') + return + } + board[x][y] = 'B' + for i := 0; i < 8; i++ { + nx, ny := x+dir8[i][0], y+dir8[i][1] + if isInBoard(board, nx, ny) && board[nx][ny] != 'B' { + dfs(board, nx, ny) } } - mineSweeper(click[0], click[1], board, mineMap, dir8) - return board } func isInBoard(board [][]byte, x, y int) bool { return x >= 0 && x < len(board) && y >= 0 && y < len(board[0]) } - -func mineSweeper(x, y int, board [][]byte, mineMap [][]int, dir8 [][]int) { - if board[x][y] != 'M' && board[x][y] != 'E' { - return - } - if mineMap[x][y] == -1 { - board[x][y] = 'X' - } else if mineMap[x][y] > 0 { - board[x][y] = '0' + byte(mineMap[x][y]) - } else { - board[x][y] = 'B' - for _, d := range dir8 { - nx, ny := x+d[0], y+d[1] - if isInBoard(board, nx, ny) && mineMap[nx][ny] >= 0 { - mineSweeper(nx, ny, board, mineMap, dir8) - } - } - } -} diff --git a/leetcode/0529.Minesweeper/README.md b/leetcode/0529.Minesweeper/README.md index f2166a69..d25c79c5 100644 --- a/leetcode/0529.Minesweeper/README.md +++ b/leetcode/0529.Minesweeper/README.md @@ -103,43 +103,33 @@ func updateBoard(board [][]byte, click []int) [][]byte { board[click[0]][click[1]] = 'X' return board } - mineMap := make([][]int, len(board)) - for i := range board { - mineMap[i] = make([]int, len(board[i])) - } - for i := range board { - for j := range board[i] { - if board[i][j] == 'M' { - mineMap[i][j] = -1 - for _, d := range dir8 { - nx, ny := i+d[0], j+d[1] - if isInBoard(board, nx, ny) && mineMap[nx][ny] >= 0 { - mineMap[nx][ny]++ - } - } - } - } - } - mineSweeper(click[0], click[1], board, mineMap, dir8) + dfs(board, click[0], click[1]) return board } -func mineSweeper(x, y int, board [][]byte, mineMap [][]int, dir8 [][]int) { - if board[x][y] != 'M' && board[x][y] != 'E' { +func dfs(board [][]byte, x, y int) { + cnt := 0 + for i := 0; i < 8; i++ { + nx, ny := x+dir8[i][0], y+dir8[i][1] + if isInBoard(board, nx, ny) && board[nx][ny] == 'M' { + cnt++ + + } + } + if cnt > 0 { + board[x][y] = byte(cnt + '0') return } - if mineMap[x][y] == -1 { - board[x][y] = 'X' - } else if mineMap[x][y] > 0 { - board[x][y] = '0' + byte(mineMap[x][y]) - } else { - board[x][y] = 'B' - for _, d := range dir8 { - nx, ny := x+d[0], y+d[1] - if isInBoard(board, nx, ny) && mineMap[nx][ny] >= 0 { - mineSweeper(nx, ny, board, mineMap, dir8) - } + board[x][y] = 'B' + for i := 0; i < 8; i++ { + nx, ny := x+dir8[i][0], y+dir8[i][1] + if isInBoard(board, nx, ny) && board[nx][ny] != 'B' { + dfs(board, nx, ny) } } } + +func isInBoard(board [][]byte, x, y int) bool { + return x >= 0 && x < len(board) && y >= 0 && y < len(board[0]) +} ``` \ No newline at end of file diff --git a/website/content/ChapterFour/0500~0599/0529.Minesweeper.md b/website/content/ChapterFour/0500~0599/0529.Minesweeper.md index 1593ad8b..d628f5ab 100644 --- a/website/content/ChapterFour/0500~0599/0529.Minesweeper.md +++ b/website/content/ChapterFour/0500~0599/0529.Minesweeper.md @@ -103,47 +103,35 @@ func updateBoard(board [][]byte, click []int) [][]byte { board[click[0]][click[1]] = 'X' return board } - mineMap := make([][]int, len(board)) - for i := range board { - mineMap[i] = make([]int, len(board[i])) - } - for i := range board { - for j := range board[i] { - if board[i][j] == 'M' { - mineMap[i][j] = -1 - for _, d := range dir8 { - nx, ny := i+d[0], j+d[1] - if isInBoard(board, nx, ny) && mineMap[nx][ny] >= 0 { - mineMap[nx][ny]++ - } - } - } - } - } - mineSweeper(click[0], click[1], board, mineMap, dir8) + dfs(board, click[0], click[1]) return board } -func mineSweeper(x, y int, board [][]byte, mineMap [][]int, dir8 [][]int) { - if board[x][y] != 'M' && board[x][y] != 'E' { +func dfs(board [][]byte, x, y int) { + cnt := 0 + for i := 0; i < 8; i++ { + nx, ny := x+dir8[i][0], y+dir8[i][1] + if isInBoard(board, nx, ny) && board[nx][ny] == 'M' { + cnt++ + } + } + if cnt > 0 { + board[x][y] = byte(cnt + '0') return } - if mineMap[x][y] == -1 { - board[x][y] = 'X' - } else if mineMap[x][y] > 0 { - board[x][y] = '0' + byte(mineMap[x][y]) - } else { - board[x][y] = 'B' - for _, d := range dir8 { - nx, ny := x+d[0], y+d[1] - if isInBoard(board, nx, ny) && mineMap[nx][ny] >= 0 { - mineSweeper(nx, ny, board, mineMap, dir8) - } + board[x][y] = 'B' + for i := 0; i < 8; i++ { + nx, ny := x+dir8[i][0], y+dir8[i][1] + if isInBoard(board, nx, ny) && board[nx][ny] != 'B' { + dfs(board, nx, ny) } } } -``` +func isInBoard(board [][]byte, x, y int) bool { + return x >= 0 && x < len(board) && y >= 0 && y < len(board[0]) +} +``` ----------------------------------------------