LeetCode 130 [Surrounded Regions]

原題

給一個二維的矩陣,包含 'X' 和 'O', 找到所有被 'X' 圍繞的區(qū)域,并用 'X' 填充滿。

樣例
給出二維矩陣:

X X X X
X O O X
X X O X
X O X X

把被 'X' 圍繞的區(qū)域填充之后變?yōu)椋?/p>

X X X X
X X X X
X X X X
X O X X

解題思路

  • 通過分析可知,就是要將所有以O(shè)組成、但沒有連通到網(wǎng)格邊緣的區(qū)域變?yōu)閄。
  • 所以可以沿著四個邊找O,找到每一個O就把相連的都變成Y,因為 他們都是要保留的,最后遍歷二維數(shù)組,遇到O變成X,遇到Y(jié)變回O
  • 具體方法可以采用BFS, DFS, Union Find,但是DFS大數(shù)據(jù)會爆棧,DFS最快

完整代碼

import Queue
class Solution(object):
    def solve(self, board):
        """
        :type board: List[List[str]]
        :rtype: void Do not return anything, modify board in-place instead.
        """
        def fill(x, y):
            if x < 0 or x > height-1 or y < 0 or y > width-1 or board[x][y] != "O":
                return
            MyQueue.put((x, y))
            board[x][y] = "D"
            
        def bfs(x, y):
            if board[x][y] == "O":
                fill(x, y)
                
            while not MyQueue.empty():
                current = MyQueue.get()
                i, j = current[0], current[1]
                fill(i+1, j)
                fill(i-1, j)
                fill(i, j+1)
                fill(i, j-1)
                
        if len(board) == 0:
            return
        
        height, width, MyQueue = len(board), len(board[0]), Queue.Queue()
        for i in range(width):
            bfs(0, i)
            bfs(height - 1, i)
        
        for j in range(1, height - 1):
            bfs(j, 0)
            bfs(j, width - 1)
            
        for i in range(height):
            for j in range(width):
                if board[i][j] == "D":
                    board[i][j] = "O"
                elif board[i][j] == "O":
                    board[i][j] = "X"
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

推薦閱讀更多精彩內(nèi)容