【leetcode热题】被围绕的区域
- 难度: 中等
- 通过率: 21.6%
- 题目链接:. - 力扣(LeetCode)
题目描述
给定一个二维的矩阵,包含 '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:returnn_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:returnif col < 0 or col >= n_col:returnch = board[row][col]if ch == 'X' or ch == '*':returnboard[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)