给定一个二维的矩阵,包含 'X'
和 'O'
(字母 O)。
找到所有被 'X'
围绕的区域,并将这些区域里所有的 'O'
用 'X'
填充。
示例:
X X X X X O O X X X O X X O X X
运行你的函数后,矩阵变为:
X X X X X X X X X X X X X O X X
解释:
被围绕的区间不会存在于边界上,换句话说,任何边界上的 'O'
都不会被填充为 'X'
。 任何不在边界上,或不与边界上的 'O'
相连的 'O'
最终都会被填充为 'X'
。如果两个元素在水平或垂直方向相邻,则称它们是“相连”的。
思路:使用深度优先搜索(DFS)。先找到边界上的所有O,将其替换成*,再将剩下的O(被X围绕)换成X,将*还原成O。
class Solution(object):
def solve(self, board):
"""
:type board: List[List[str]]
:rtype: void Do not return anything, modify board in-place instead.
"""
if len(board) <= 0 or len(board[0]) <= 0:
return
row = len(board)
col = len(board[0])
# 第一列和最后一列进行DFS,将与边界O相邻的O全部标记为*
# 第一行和最后一行同上
for i in range(row):
if board[i][0] == 'O':
self.dfs(board, i, 0)
if board[i][col - 1] == 'O':
self.dfs(board, i, col - 1)
for j in range(col):
if board[0][j] == 'O':
self.dfs(board, 0, j)
if board[row - 1][j] == 'O':
self.dfs(board, row - 1, j)
# 最后,标记为‘*’的表示,这块O连通图为没有被包围的,还原为'O',仍然为‘O’的表示被X包围
# 了,要改成‘X’
for m in range(row):
for n in range(col):
if board[m][n] == '*':
board[m][n] = 'O':
elif board[m][n] == 'O':
board[m][n] = 'X'
def dfs(self, board, row, col):
if row < 0 or col < 0 or row >= len(board) or col >= len(board[0]) or board[row][col] != 'O':
return
board[row][col] = '*'
self.dfs(board, row + 1, col)
self.dfs(board, row - 1, col)
self.dfs(board, row, col + 1)
self.dfs(board, row, col - 1)