被围绕的区域
- 难度: 中等
- 通过率: 21.6%
- 题目链接:https://leetcode-cn.com/problems/surrounded-regions
题目描述
给定一个二维的矩阵,包含 '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
相连的位置标记为 *
。然后对整个 board
遍历,把 O
设为 X
,把 *
设为 O
。
class Solution:
def solve(self, board) -> None:
if not board:
return
n_row = len(board)
n_col = len(board[0])
for i in range(n_row):
self.dfs(i, 0, board)
self.dfs(i, n_col-1, board)
for i in range(n_col):
self.dfs(0, i, board)
self.dfs(n_row-1, i, board)
for row in range(n_row):
for col in range(n_col):
ch = board[row][col]
if ch == 'O':
board[row][col] = 'X'
if ch == '*':
board[row][col] = 'O'
def dfs(self, row, col, board):
n_row = len(board)
n_col = len(board[0])
if row < 0 or row >= n_row:
return
if col < 0 or col >= n_col:
return
ch = board[row][col]
if ch == 'X' or ch == '*':
return
board[row][col] = '*'
self.dfs(row-1, col, board)
self.dfs(row+1, col, board)
self.dfs(row, col-1, board)
self.dfs(row, col+1, board)