Welcome to Subscribe On Youtube
529. Minesweeper
Description
Let's play the minesweeper game (Wikipedia, online game)!
You are given an m x n
char matrix board
representing the game board where:
'M'
represents an unrevealed mine,'E'
represents an unrevealed empty square,'B'
represents a revealed blank square that has no adjacent mines (i.e., above, below, left, right, and all 4 diagonals),- digit (
'1'
to'8'
) represents how many mines are adjacent to this revealed square, and 'X'
represents a revealed mine.
You are also given an integer array click
where click = [clickr, clickc]
represents the next click position among all the unrevealed squares ('M'
or 'E'
).
Return the board after revealing this position according to the following rules:
- If a mine
'M'
is revealed, then the game is over. You should change it to'X'
. - If an empty square
'E'
with no adjacent mines is revealed, then change it to a revealed blank'B'
and all of its adjacent unrevealed squares should be revealed recursively. - If an empty square
'E'
with at least one adjacent mine is revealed, then change it to a digit ('1'
to'8'
) representing the number of adjacent mines. - Return the board when no more squares will be revealed.
Example 1:
Input: board = [["E","E","E","E","E"],["E","E","M","E","E"],["E","E","E","E","E"],["E","E","E","E","E"]], click = [3,0] Output: [["B","1","E","1","B"],["B","1","M","1","B"],["B","1","1","1","B"],["B","B","B","B","B"]]
Example 2:
Input: board = [["B","1","E","1","B"],["B","1","M","1","B"],["B","1","1","1","B"],["B","B","B","B","B"]], click = [1,2] Output: [["B","1","E","1","B"],["B","1","X","1","B"],["B","1","1","1","B"],["B","B","B","B","B"]]
Constraints:
m == board.length
n == board[i].length
1 <= m, n <= 50
board[i][j]
is either'M'
,'E'
,'B'
, or a digit from'1'
to'8'
.click.length == 2
0 <= clickr < m
0 <= clickc < n
board[clickr][clickc]
is either'M'
or'E'
.
Solutions
-
class Solution { private char[][] board; private int m; private int n; public char[][] updateBoard(char[][] board, int[] click) { m = board.length; n = board[0].length; this.board = board; int i = click[0], j = click[1]; if (board[i][j] == 'M') { board[i][j] = 'X'; } else { dfs(i, j); } return board; } private void dfs(int i, int j) { int cnt = 0; for (int x = i - 1; x <= i + 1; ++x) { for (int y = j - 1; y <= j + 1; ++y) { if (x >= 0 && x < m && y >= 0 && y < n && board[x][y] == 'M') { ++cnt; } } } if (cnt > 0) { board[i][j] = (char) (cnt + '0'); } else { board[i][j] = 'B'; for (int x = i - 1; x <= i + 1; ++x) { for (int y = j - 1; y <= j + 1; ++y) { if (x >= 0 && x < m && y >= 0 && y < n && board[x][y] == 'E') { dfs(x, y); } } } } } }
-
class Solution { public: vector<vector<char>> updateBoard(vector<vector<char>>& board, vector<int>& click) { int m = board.size(), n = board[0].size(); int i = click[0], j = click[1]; function<void(int, int)> dfs = [&](int i, int j) { int cnt = 0; for (int x = i - 1; x <= i + 1; ++x) { for (int y = j - 1; y <= j + 1; ++y) { if (x >= 0 && x < m && y >= 0 && y < n && board[x][y] == 'M') { ++cnt; } } } if (cnt) { board[i][j] = cnt + '0'; } else { board[i][j] = 'B'; for (int x = i - 1; x <= i + 1; ++x) { for (int y = j - 1; y <= j + 1; ++y) { if (x >= 0 && x < m && y >= 0 && y < n && board[x][y] == 'E') { dfs(x, y); } } } } }; if (board[i][j] == 'M') { board[i][j] = 'X'; } else { dfs(i, j); } return board; } };
-
class Solution: def updateBoard(self, board: List[List[str]], click: List[int]) -> List[List[str]]: def dfs(i: int, j: int): cnt = 0 for x in range(i - 1, i + 2): for y in range(j - 1, j + 2): if 0 <= x < m and 0 <= y < n and board[x][y] == "M": cnt += 1 if cnt: board[i][j] = str(cnt) else: board[i][j] = "B" for x in range(i - 1, i + 2): for y in range(j - 1, j + 2): if 0 <= x < m and 0 <= y < n and board[x][y] == "E": dfs(x, y) m, n = len(board), len(board[0]) i, j = click if board[i][j] == "M": board[i][j] = "X" else: dfs(i, j) return board
-
func updateBoard(board [][]byte, click []int) [][]byte { m, n := len(board), len(board[0]) i, j := click[0], click[1] var dfs func(i, j int) dfs = func(i, j int) { cnt := 0 for x := i - 1; x <= i+1; x++ { for y := j - 1; y <= j+1; y++ { if x >= 0 && x < m && y >= 0 && y < n && board[x][y] == 'M' { cnt++ } } } if cnt > 0 { board[i][j] = byte(cnt + '0') return } board[i][j] = 'B' for x := i - 1; x <= i+1; x++ { for y := j - 1; y <= j+1; y++ { if x >= 0 && x < m && y >= 0 && y < n && board[x][y] == 'E' { dfs(x, y) } } } } if board[i][j] == 'M' { board[i][j] = 'X' } else { dfs(i, j) } return board }
-
function updateBoard(board: string[][], click: number[]): string[][] { const m = board.length; const n = board[0].length; const [i, j] = click; const dfs = (i: number, j: number) => { let cnt = 0; for (let x = i - 1; x <= i + 1; ++x) { for (let y = j - 1; y <= j + 1; ++y) { if (x >= 0 && x < m && y >= 0 && y < n && board[x][y] === 'M') { ++cnt; } } } if (cnt > 0) { board[i][j] = cnt.toString(); return; } board[i][j] = 'B'; for (let x = i - 1; x <= i + 1; ++x) { for (let y = j - 1; y <= j + 1; ++y) { if (x >= 0 && x < m && y >= 0 && y < n && board[x][y] === 'E') { dfs(x, y); } } } }; if (board[i][j] === 'M') { board[i][j] = 'X'; } else { dfs(i, j); } return board; }