题目描述:给定一个二维的矩阵,包含 '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'
。如果两个元素在水平或垂直方向相邻,则称它们是“相连”的。
解法1。DFS的做法,基本思路就是遍历整个二维数组,在边界上的O用DFS不断把与之相连的O用$标记出来,这一步结束后就可以做复原工作了,剩下仍为O的就是应该被置为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 not board:
return
m = len(board)-1
n = len(board[0])-1 # 注意m和n的意义,表示的是下标的上限
for i in range(m+1):
for j in range(n+1):
if (i == 0 or i == m or j == 0 or j == n) and board[i][j]=='O':
self.dfs(i, j, board, m, n) # 一旦发现边界上有O,就把与之相连的所有O用$圈出来
# 复原,不与边界O相连的都是被包围的,都转为X,而被标为$的复原为O
for i in range(m+1):
for j in range(n+1):
if board[i][j] == 'O':
board[i][j] = 'X'
if board[i][j] == '$':
board[i][j] = 'O'
def dfs(self, i, j, board, m, n):
if board[i][j] == 'O':
board[i][j] = '$'
if i > 0 and board[i-1][j] == 'O':
self.dfs(i-1, j, board, m, n)
if i < m and board[i+1][j] == 'O':
self.dfs(i+1, j, board, m, n)
if j > 0 and board[i][j-1] == 'O':
self.dfs(i, j-1, board, m, n)
if j < n and board[i][j+1] == 'O':
self.dfs(i, j+1, board, m, n)