LeetCode 题解工作台
扫雷游戏
让我们一起来玩扫雷游戏! 给你一个大小为 m x n 二维字符矩阵 board ,表示扫雷游戏的盘面,其中: 'M' 代表一个 未挖出的 地雷, 'E' 代表一个 未挖出的 空方块, 'B' 代表没有相邻(上,下,左,右,和所有4个对角线)地雷的 已挖出的 空白方块, 数字 ( '1' 到 '8' …
4
题型
5
代码语言
3
相关题
当前训练重点
中等 · 图·搜索
答案摘要
我们记 $click = (i, j)$,如果 等于 `'M'`,那么直接将 的值改为 `'X'` 即可。否则,我们需要统计 周围的地雷数量 ,如果 不为 ,那么将 的值改为 的字符串形式。否则,将 的值改为 `'B'`,并且递归地搜索处理 周围的未挖出的方块。 时间复杂度 $O(m \times n)$,空间复杂度 $O(m \times n)$。其中 和 分别是二维数组 …
Interview AiBoxInterview AiBox 实时 AI 助手,陪你讲清 图·搜索 题型思路
题目描述
让我们一起来玩扫雷游戏!
给你一个大小为 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'),表示相邻地雷的数量。 - 如果在此次点击中,若无更多方块可被揭露,则返回盘面。
示例 1:
输入:board = [["E","E","E","E","E"],["E","E","M","E","E"],["E","E","E","E","E"],["E","E","E","E","E"]], click = [3,0] 输出:[["B","1","E","1","B"],["B","1","M","1","B"],["B","1","1","1","B"],["B","B","B","B","B"]]
示例 2:
输入:board = [["B","1","E","1","B"],["B","1","M","1","B"],["B","1","1","1","B"],["B","B","B","B","B"]], click = [1,2] 输出:[["B","1","E","1","B"],["B","1","X","1","B"],["B","1","1","1","B"],["B","B","B","B","B"]]
提示:
m == board.lengthn == board[i].length1 <= m, n <= 50board[i][j]为'M'、'E'、'B'或数字'1'到'8'中的一个click.length == 20 <= clickr < m0 <= clickc < nboard[clickr][clickc]为'M'或'E'
解题思路
方法一:DFS
我们记 ,如果 等于 'M',那么直接将 的值改为 'X' 即可。否则,我们需要统计 周围的地雷数量 ,如果 不为 ,那么将 的值改为 的字符串形式。否则,将 的值改为 'B',并且递归地搜索处理 周围的未挖出的方块。
时间复杂度 ,空间复杂度 。其中 和 分别是二维数组 的行数和列数。
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
复杂度分析
| 指标 | 值 |
|---|---|
| 时间 | Depends on the final approach |
| 空间 | Depends on the final approach |
面试官常问的追问
外企场景- question_mark
Look for efficient DFS implementation that minimizes unnecessary checks.
- question_mark
Ensure the candidate handles edge cases like clicks on borders and corners.
- question_mark
Check if they can correctly update adjacent cells while respecting the grid's boundaries.
常见陷阱
外企场景- error
Not handling recursion depth properly, leading to stack overflow or missing updates.
- error
Incorrect boundary checks when accessing neighboring cells, leading to out-of-bounds errors.
- error
Failing to efficiently calculate adjacent mines, resulting in incorrect board updates.
进阶变体
外企场景- arrow_right_alt
Modify the board size to handle larger or smaller grids efficiently.
- arrow_right_alt
Introduce additional game features like flags or different mine types.
- arrow_right_alt
Optimize the algorithm to use Breadth-First Search (BFS) instead of DFS.