【LeetCode 中等题】60-被围绕的区域

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

解法1。DFS的做法,基本思路就是遍历整个二维数组,在边界上的O用DFS不断把与之相连的O用$标记出来,这一步结束后就可以做复原工作了,剩下仍为O的就是应该被置为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 not board:
            return
        m = len(board)-1
        n = len(board[0])-1    # 注意m和n的意义,表示的是下标的上限
        for i in range(m+1):
            for j in range(n+1):
                if (i == 0 or i == m or j == 0 or j == n) and board[i][j]=='O':
                    self.dfs(i, j, board, m, n) # 一旦发现边界上有O,就把与之相连的所有O用$圈出来
        # 复原,不与边界O相连的都是被包围的,都转为X,而被标为$的复原为O
        for i in range(m+1):
            for j in range(n+1):
                if board[i][j] == 'O':
                    board[i][j] = 'X'
                if board[i][j] == '$':
                    board[i][j] = 'O'
                    
        
    def dfs(self, i, j, board, m, n):
        if board[i][j] == 'O':
            board[i][j] = '$'
        if i > 0 and board[i-1][j] == 'O':
            self.dfs(i-1, j, board, m, n)
        if i < m and board[i+1][j] == 'O':
            self.dfs(i+1, j, board, m, n)
        if j > 0 and board[i][j-1] == 'O':
            self.dfs(i, j-1, board, m, n)
        if j < n and board[i][j+1] == 'O':
            self.dfs(i, j+1, board, m, n)

猜你喜欢

转载自blog.csdn.net/weixin_41011942/article/details/86095770
今日推荐