1. 程式人生 > >LeetCode130被圍繞的區域

LeetCode130被圍繞的區域

題目描述

給定一個二維的矩陣,包含 '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 是不需要被替換的,我們需要找的是非邊界上被包圍的 O ,其實也就是把能通過邊界上的 O 到達的節點找到即可。

這樣稍微轉換一下就想明白了,就是按照邊界上的 O 進行廣度優先搜尋就可以。

第一步:

初始化,使用一個佇列 Q 來儲存邊界上的 O,並將其標記出來。

第二步:

佇列 Q 取出頭部元素,進行廣度優先搜尋(其實就是上下左右四個方向,判斷相應的元素即可)。將搜到的元素進行標記,並將其加入佇列中。

第三步:

繼續,如果佇列 Q 不為空,繼續取其頭元素,重複執行第二步。

以下是圖示:

程式碼實現

GitHub 程式碼地址

def solve(self, board):
        """
        :type board: List[List[str]]
        :rtype: void Do not return anything, modify board in-place instead.
        """
        if board:

            queue = []

            for index, i in enumerate(board[0]):
                if
i == "O": board[0][index] = "-" queue.append([0, index]) for index, i in enumerate(board[-1]): if i == "O": board[len(board) - 1][index] = "-" queue.append([len(board) - 1, index]) for i in range(len(board)): if board[i][0] == "O": board[i][0] = "-" queue.append([i, 0]) for i in range(len(board)): if board[i][-1] == "O": board[i][len(board[0]) - 1] = "-" queue.append([i, len(board[0]) - 1]) while queue: top = queue.pop(0) x, y = top[0], top[1] # 上下左右新增 if x - 1 > 0 and board[x - 1][y] == "O": board[x - 1][y] = "-" queue.append([x - 1, y]) if x + 1 < len(board) and board[x + 1][y] == "O": board[x + 1][y] = "-" queue.append([x + 1, y]) if y - 1 > 0 and board[x][y - 1] == "O": board[x][y - 1] = "-" queue.append([x, y - 1]) if y + 1 < len(board[0]) and board[x][y + 1] == "O": board[x][y + 1] = "-" queue.append([x, y + 1]) for i in range(len(board)): for j in range(len(board[0])): if board[i][j] == "O": board[i][j] = "X" if board[i][j] == "-": board[i][j] = "O"