方法:深度优先搜索
思路:模拟点击,注意边界条件,输入是否合法,判断元素
class Solution:
def updateBoard(self, board: List[List[str]], click: List[int]) -> List[List[str]]:
# 如果board不存在元素,则直接返回
if not board or not board[0]:
return board
rows, cols = len(board), len(board[0])
# 如果没有在board里面,则返回
if not ((0 <= click[0] < rows) and (0 <= click[1] < cols)):
return board
# 如果遇到 M 则返回 X
if board[click[0]][click[1]] == 'M':
board[click[0]][click[1]] = 'X'
return board
# 深度优先搜索
def dfs(i, j):
# 边界条件
if not (0 <= i < rows and 0 <= j < cols and board[i][j] == 'E'):
return
direction = [(-1, -1),(-1, 0),(-1, 1),(0, -1),(0, 1),(1, -1),(1, 0),(1, 1)]
bomb_num = 0
for n in direction:
# 易忘记,判断输入是否合法
if 0 <= (n[0] + i) < rows and 0 <= (n[1] + j) < cols and board[n[0] + i][n[1] + j] == 'M':
bomb_num += 1
if bomb_num > 0:
board[i][j] = str(bomb_num)
else:
board[i][j] = 'B'
for m in direction: # 一定写在else里面,不然if也会调用
dfs(m[0] + i, m[1] + j)
return # 要记得返回,不然会超出递归深度,程序不能结束
dfs(click[0], click[1])
return board