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'
.
Companies:
Uber, LiveRamp, Facebook, Cruise Automation, Microsoft, Amazon
Related Topics:
Array, Depth-First Search, Breadth-First Search, Matrix
Similar Questions:
// OJ: https://leetcode.com/problems/minesweeper/
// Author: github.com/lzl124631x
// Time: O(MN)
// Space: O(MN)
class Solution {
public:
vector<vector<char>> updateBoard(vector<vector<char>>& A, vector<int>& click) {
int M = A.size(), N = A[0].size();
queue<pair<int, int>> q{{{click[0], click[1]}}};
while (q.size()) {
auto [x, y] = q.front();
q.pop();
if (A[x][y] == 'M') {
A[x][y] = 'X';
continue;
}
int cnt = 0;
for (int dx = -1; dx <= 1; ++dx) {
for (int dy = -1; dy <= 1; ++dy) {
if (dx == 0 && dy == 0) continue;
int a = x + dx, b = y + dy;
if (a < 0 || a >= M || b < 0 || b >= N) continue;
cnt += A[a][b] == 'M';
}
}
if (cnt) A[x][y] = '0' + cnt;
else {
A[x][y] = 'B';
for (int dx = -1; dx <= 1; ++dx) {
for (int dy = -1; dy <= 1; ++dy) {
if (dx == 0 && dy == 0) continue;
int a = x + dx, b = y + dy;
if (a < 0 || a >= M || b < 0 || b >= N || A[a][b] != 'E') continue;
A[a][b] = '#';
q.emplace(a, b);
}
}
}
}
return A;
}
};
// OJ: https://leetcode.com/problems/minesweeper/
// Author: github.com/lzl124631x
// Time: O(MN)
// Space: O(MN)
class Solution {
public:
vector<vector<char>> updateBoard(vector<vector<char>>& A, vector<int>& click) {
int M = A.size(), N = A[0].size();
function<void(int, int)> dfs = [&](int x, int y) {
if (A[x][y] == 'M') {
A[x][y] = 'X';
return;
}
int cnt = 0;
for (int dx = -1; dx <= 1; ++dx) {
for (int dy = -1; dy <= 1; ++dy) {
if (dx == 0 && dy == 0) continue;
int a = x + dx, b = y + dy;
if (a < 0 || a >= M || b < 0 || b >= N) continue;
cnt += A[a][b] == 'M';
}
}
if (cnt) A[x][y] = '0' + cnt;
else {
A[x][y] = 'B';
for (int dx = -1; dx <= 1; ++dx) {
for (int dy = -1; dy <= 1; ++dy) {
if (dx == 0 && dy == 0) continue;
int a = x + dx, b = y + dy;
if (a < 0 || a >= M || b < 0 || b >= N || A[a][b] != 'E') continue;
dfs(a, b);
}
}
}
};
dfs(click[0], click[1]);
return A;
}
};