这个题解采用了深度优先搜索(DFS)的方法。首先对矩阵的四条边界上的 'O' 进行 DFS,标记所有与边界 'O' 相连的 'O',这些 'O' 不会被填充为 'X'。然后遍历矩阵内部,将所有未被标记的 'O' 填充为 'X'。
时间复杂度: O(mn)
空间复杂度: O(mn)
class Solution:
def solve(self, board: List[List[str]]) -> None:
"""
Do not return anything, modify board in-place instead.
"""
dirs = [[-1,0],[1,0],[0,1],[0,-1]] # 四个方向:上、下、右、左
rows = len(board) # 矩阵的行数
cols = len(board[0]) # 矩阵的列数
visited = [[False] * cols for _ in range(rows)] # 标记格子是否访问过
def in_area(row,col): # 判断坐标 (row, col) 是否在矩阵内
return 0 <= row < rows and 0 <= col < cols
def dfs(row,col): # 深度优先搜索
if not in_area(row,col) or board[row][col] == 'X' or visited[row][col]:
return
visited[row][col] = True
for d in dirs: # 向四个方向扩展
next_row = row + d[0]
next_col = col + d[1]
dfs(next_row,next_col)
# 对左右两条竖边进行 DFS
for col in range(cols):
if board[0][col] == 'O' and not visited[0][col]:
dfs(0, col)
if board[rows - 1][col] == 'O' and not visited[rows - 1][col]:
dfs(rows - 1, col)
# 对上下两条横边进行 DFS
for row in range(1, rows - 1):
if board[row][0] == 'O' and not visited[row][0]:
dfs(row, 0)
if board[row][cols - 1] == 'O' and not visited[row][cols - 1]:
dfs(row, cols - 1)
# 将所有未标记的 'O' 填充为 'X'
for row in range(1, rows - 1):
for col in range(1, cols - 1):
if board[row][col] == 'O' and not visited[row][col]:
board[row][col] = 'X'