-
Notifications
You must be signed in to change notification settings - Fork 23
/
Copy path0529-minesweeper.js
68 lines (62 loc) · 2.23 KB
/
0529-minesweeper.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
/**
* 529. Minesweeper
* https://leetcode.com/problems/minesweeper/
* Difficulty: Medium
*
* 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:
* 1. If a mine 'M' is revealed, then the game is over. You should change it to 'X'.
* 2. 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.
* 3. 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.
* 4. Return the board when no more squares will be revealed.
*/
/**
* @param {character[][]} board
* @param {number[]} click
* @return {character[][]}
*/
var updateBoard = function(board, click) {
const [row, col] = click;
const rows = board.length;
const cols = board[0].length;
const directions = [
[-1, -1], [-1, 0], [-1, 1], [0, -1], [0, 1], [1, -1], [1, 0], [1, 1]
];
if (board[row][col] === 'M') {
board[row][col] = 'X';
return board;
}
dfs(row, col);
return board;
function dfs(r, c) {
if (r < 0 || r >= rows || c < 0 || c >= cols || board[r][c] !== 'E') return;
let mines = 0;
for (const [dr, dc] of directions) {
const nr = r + dr;
const nc = c + dc;
if (nr >= 0 && nr < rows && nc >= 0 && nc < cols && board[nr][nc] === 'M') {
mines++;
}
}
board[r][c] = mines > 0 ? mines.toString() : 'B';
if (mines === 0) {
for (const [dr, dc] of directions) {
dfs(r + dr, c + dc);
}
}
}
};