问题链接
529 SL
问题描述
给你一个大小为 m
x n
二维字符矩阵 board
,表示盘面,其中:
M
代表一个 未挖出的 地雷,
E
代表一个 未挖出的 空方块,
B
代表没有相邻(上,下,左,右,和所有4个对角线)地雷的 已挖出的 空白方块,
数字(1
到 8
)表示有多少地雷与这块 已挖出的 方块相邻,
X
则表示一个 已挖出的 地雷。
给你一个整数数组 click
,其中 click = [clickr, clickc]
表示在所有 未挖出的 方块(M
或者 E
)中的下一个点击位置(clickr
是行下标,clickc
是列下标)。
根据以下规则,返回相应位置被点击后对应的盘面:
如果一个地雷M
被挖出,游戏就结束了- 把它改为 X
。
如果一个 没有相邻地雷 的空方块E
被挖出,修改它为B
,并且所有和其相邻的 未挖出
方块都应该被递归地揭露。
如果一个 至少与一个地雷相邻
的空方块E
被挖出,修改它为数字1
到 8
,表示相邻地雷的数量。
如果在此次点击中,若无更多方块可被揭露,则返回盘面。
示例
解题思路
模拟法+深度优先搜索直接冲!
代码示例(JAVA)
class Solution {
int[] arrX = {1, -1, 0, 0, 1, -1, 1, -1};
int[] arrY = {0, 0, 1, -1, 1, -1, -1, 1};
public char[][] updateBoard(char[][] board, int[] click) {
dfs(board, click);
return board;
}
public void dfs(char[][] board, int[] click) {
int m = board.length, n = board[0].length;
int x = click[0], y = click[1];
if (board[x][y] == 'M') {
board[x][y] = 'X';
return;
}
int count = 0;
for (int i = 0; i < arrX.length; i++) {
if (x + arrX[i] >= 0 && x + arrX[i] < m && y + arrY[i] >= 0 && y + arrY[i] < n
&& board[x + arrX[i]][y + arrY[i]] == 'M') {
count++;
}
}
if (count != 0) {
board[x][y] = (char) (count + 48);
} else {
board[x][y] = 'B';
for (int i = 0; i < arrX.length; i++) {
if (x + arrX[i] >= 0 && x + arrX[i] < m && y + arrY[i] >= 0 && y + arrY[i] < n
&& (board[x + arrX[i]][y + arrY[i]] == 'M' || board[x + arrX[i]][y + arrY[i]] == 'E')) {
dfs(board, new int[]{x + arrX[i], y + arrY[i]});
}
}
}
}
}
执行结果
网友评论