1. 程式人生 > >【LeetCode 中等題】60-被圍繞的區域

【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)