Leetcode•Aug 13, 2025
Minesweeper
Hazrat Ali
Leetcode
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"]]
Solution
/**
* @param {character[][]} board
* @param {number[]} click
* @return {character[][]}
*/
const updateBoard = (board, click) => {
const [x, y] = click;
if (board[x][y] === 'M') {
board[x][y] = 'X';
} else {
bfs(board, click);
}
return board;
};
const bfs = (board, click) => {
const dirs = [[-1, -1], [-1, 0], [-1, 1], [0, 1], [1, 1], [1, 0], [1, -1], [0, -1]];
const m = board.length;
const n = board[0].length;
const queue = [click];
while (queue.length > 0) {
const [x, y] = queue.shift();
let minesCount = 0;
for (let [dx, dy] of dirs) {
const i = x + dx;
const j = y + dy;
if (i >= 0 && i < m && j >= 0 && j < n && board[i][j] === 'M') {
minesCount++;
}
}
if (minesCount > 0) {
board[x][y] = '' + minesCount;
} else {
board[x][y] = 'B';
for (let [dx, dy] of dirs) {
const i = x + dx;
const j = y + dy;
if (i >= 0 && i < m && j >= 0 && j < n && board[i][j] === 'E') {
queue.push([i, j]);
board[i][j] = 'B';
}
}
}
}
};