[LeetCode]130 被围绕的区域

题目描述

给定一个二维的矩阵,包含 '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'。如果两个元素在水平或垂直方向相邻,则称它们是“相连”的。

思路

  • 先对边界上每一个’O’做深度优先搜索,将与其相连的所有’O’改为’-‘
  • 遍历矩阵,将矩阵中所有’O’改为’X’,将矩阵中所有’-‘变为’O’

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
class Solution:
def solve(self, board):
"""
:type board: List[List[str]]
:rtype: void Do not return anything, modify board in-place instead.
"""
if board==None or len(board)==0:
return
row = len(board)
col = len(board[0])
for i in range(row):
self.dfs(board, i, 0)
self.dfs(board, i, col-1)
for j in range(col):
self.dfs(board, 0, j)
self.dfs(board, row-1, j)
for i in range(row):
for j in range(col):
if board[i][j]=='O':
board[i][j] = 'X'
if board[i][j]=='-':
board[i][j] = 'O'

def dfs(self, board, i, j):
if i<0 or j<0 or i>=len(board) or j>= len(board[0]) or board[i][j]!='O':
return
board[i][j] = '-'
self.dfs(board, i-1, j)
self.dfs(board, i+1, j)
self.dfs(board, i, j-1)
self.dfs(board, i, j+1)