1. 程式人生 > >LeetCode 130. 被圍繞的區域 Pyhton

LeetCode 130. 被圍繞的區域 Pyhton

給定一個二維的矩陣,包含 '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進行dfs,把邊界O的’O’變為“ * ” ,然後對邊界上的" O "進行DFS,和它連通的‘ O’,都標記為‘ * ’,最後在遍歷陣列,把‘ O’變成‘X’,把‘ * ’,變成‘’O‘’。

程式碼:Python版

class Solution:
    def solve(self, board):
        """
        :type board: List[List[str]]
        :rtype: void Do not return anything, modify board in-place instead.
        """
        if board == None :
            return []
        for i in range(len(board)):
            for j in range(len(board[0])):
                if board[i][j] == 'O':
                    if i == 0 or i == len(board) -1 or j == 0 or j == len(board[0]) -1:
                        self.robot(board,i,j,len(board),len(board[0]))
        
        for i in range(len(board)):
            for j in range(len(board[0])):
                if board[i][j] == 'O':
                    board[i][j] = 'X'
                elif board[i][j] == '*':
                    board[i][j] = 'O'

    def robot(self,board,i,j,m,n):
        dx = [0,0,1,-1]
        dy = [1,-1,0,0]
        board[i][j] = '*'
        for idx in range(4):
            if i + dx[idx] >= 0 and i + dx[idx] < m and j + dy[idx] >= 0 and j + dy[idx] < n and board[i + dx[idx]][j + dy[idx]] == "O":
                self.robot(board,i+dx[idx],j+dy[idx],m,n)