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

思路:使用深度优先搜索(DFS)。先找到边界上的所有O,将其替换成*,再将剩下的O(被X围绕)换成X,将*还原成O。

class Solution(object):
    def solve(self, board):
        """
        :type board: List[List[str]]
        :rtype: void Do not return anything, modify board in-place instead.
        """
        if len(board) <= 0 or len(board[0]) <= 0:
            return 
        
        row = len(board)
        col = len(board[0])
        
        # 第一列和最后一列进行DFS,将与边界O相邻的O全部标记为*
        # 第一行和最后一行同上
        for i in range(row):
            if board[i][0] == 'O':
                self.dfs(board, i, 0)
            if board[i][col - 1] == 'O':
                self.dfs(board, i, col - 1)

        for j in range(col):
            if board[0][j] == 'O':
                self.dfs(board, 0, j)
            if board[row - 1][j] == 'O':
                self.dfs(board, row - 1, j)
        
        # 最后,标记为‘*’的表示,这块O连通图为没有被包围的,还原为'O',仍然为‘O’的表示被X包围                    
        #  了,要改成‘X’
        for m in range(row):
            for n in range(col):
                if board[m][n] == '*':
                    board[m][n] = 'O':
                elif board[m][n] == 'O':
                    board[m][n] = 'X'

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

猜你喜欢

转载自blog.csdn.net/qq_41805514/article/details/82929022