给定一个二维的矩阵,包含
'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'
。如果两个元素在水平或垂直方向相邻,则称它们是“相连”的。
tips: 与岛屿个数问题类似(leetcode200),都是找周围连通区域。该题的限制是只需要找出边界中“O”的连通区域,剩下的全部置为“X”即可。我们同样采用DFS,先用列表bianjie存储数组边界的横纵坐标(index),然后遍历bianjie列表,依次找中心点为列表元素且值为“O”的联通区域,每个中心点的联通区域寻找方法为dfs,将所有联通区域置为“Z”。对所有非“Z”置为“X”,最后将所有“Z”置为“O”即可。
class Solution(object):
def solve(self, board):
"""
:type board: List[List[str]]
:rtype: None Do not return anything, modify board in-place instead.
"""
if board==[[]] or board==[]:
return board
h=len(board)
w=len(board[0])
#边界获取
bianjie=[]
if h==1 or w==1:
bianjie=[[i,j] for i in range(w) for j in range(h)]
else:
for j in range(w):
bianjie.append([0,j])
for i in range(1,h):
bianjie.append([i,w-1])
for j in range(w-1,-1,-1):
bianjie.append([h-1,j])
for i in range(h-1,0,-1):
bianjie.append([i,0])
def dfs(arr,i,j):
if i<0 or i>=len(arr) or j<0 or j>=len(arr[0]) or arr[i][j]!="O":
return
arr[i][j]="Z"
dfs(arr,i+1,j)
dfs(arr,i-1,j)
dfs(arr,i,j-1)
dfs(arr,i,j+1)
#遍历边界进行递归
for bj in bianjie:
if board[bj[0]][bj[1]]=="O":
dfs(board,bj[0],bj[1])
#最终进行数组还原
for i in range(h):
for j in range(w):
if board[i][j]!="Z":
board[i][j]="X"
else:
board[i][j]="O"