被围绕的区域

题目描述

来源于 https://leetcode-cn.com/

给定一个二维的矩阵,包含 '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)