LeetCode 0529. Minesweeper扫雷游戏【Medium】【Python】【DFS】
LeetCode
Let’s play the minesweeper game (Wikipedia, online game)!
You are given a 2D char matrix representing the game board. ‘M’ represents an unrevealed mine, ‘E’ represents an unrevealed empty square, ‘B’ represents a revealed blank square that has no adjacent (above, below, left, right, and all 4 diagonals) mines, digit (‘1’ to ‘8’) represents how many mines are adjacent to this revealed square, and finally ‘X’ represents a revealed mine.
Now given the next click position (row and column indices) among all the unrevealed squares (‘M’ or ‘E’), return the board after revealing this position according to the following rules:
Example 1:
Input:
[['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:
[['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']]
Note:
力扣
让我们一起来玩扫雷游戏!
给定一个代表游戏板的二维字符矩阵。 ‘M’ 代表一个未挖出的地雷,‘E’ 代表一个未挖出的空方块,‘B’ 代表没有相邻(上,下,左,右,和所有4个对角线)地雷的已挖出的空白方块,数字(‘1’ 到 ‘8’)表示有多少地雷与这块已挖出的方块相邻,‘X’ 则表示一个已挖出的地雷。
现在给出在所有未挖出的方块中(‘M’或者’E’)的下一个点击位置(行和列索引),根据以下规则,返回相应位置被点击后对应的面板:
示例 1:
输入:
[['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:
输入:
[['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']]
注意:
DFS
1. 初始位置是雷,直接改为 X 退出
2. 初始位置不是雷:
则检查该点周围情况:
1. 若该点为B,则可以搜索周围点(被搜索的点的状态只能是E,否则会重复搜索)
2. 否则停止点击
时间复杂度: O(m*n)
空间复杂度: O(m*n)
class Solution:
def updateBoard(self, board: List[List[str]], click: List[int]) -> List[List[str]]:
# 初始位置是雷,直接改为 X 退出
if board[click[0]][click[1]] == 'M':
board[click[0]][click[1]] = 'X'
return board
self.m, self.n = len(board), len(board[0])
direction = ((1, 0), (-1, 0), (0, 1), (0, -1), (1, 1), (-1, 1), (-1, -1), (1, -1))
# 检查周围雷的情况
def check(i, j):
cnt = 0
for x, y in direction:
x, y = x + i, y + j
if 0 <= x < self.m and 0 <= y < self.n and board[x][y] == 'M':
cnt += 1
return cnt
# DFS
def dfs(i ,j):
cnt = check(i, j)
# 周围没有雷
if not cnt:
board[i][j] = 'B'
for x, y in direction:
x, y = x + i, y + j
if 0 <= x < self.m and 0 <= y < self.n and board[x][y] == 'E':
dfs(x, y)
# 标记周围有雷
else:
board[i][j] = str(cnt)
dfs(click[0], click[1])
return board
Python