[leetcode]130. 被圍繞的區域

題目描述:

給定一個二維的矩陣,包含 '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

鏈接:https://leetcode-cn.com/problems/surrounded-regions

解法1:

找到邊界上的O,對邊界上的每個O進行廣度優先搜索(bfs)

用bfs找到與邊界聯通的O,將其改爲*,最後將O改爲X,將*改爲O

class Solution:
    def solve(self, board: List[List[str]]) -> None:
        """
        Do not return anything, modify board in-place instead.
        """
        if not board:
            return
        m,n=len(board),len(board[0])
        
        def _solve(i,j):
            if board[i][j]!="O":
                return
            
            queue=list()
            queue.append((i,j))

            while queue:
                x,y=queue.pop(0)
                if board[x][y]!="O":
                    continue
                
                board[x][y]="*"
                directions=[(-1,0),(1,0),(0,-1),(0,1)]
                for d in directions:
                    nx=x+d[0]
                    ny=y+d[1]
                    if 0<=nx<m-1 and 0<=ny<n-1 and board[nx][ny]=="O":
                        queue.append((nx,ny))

        for i in range(m):
            list(map(_solve,(i,i),(0,n-1)))
            
        for j in range(n):
            list(map(_solve,(0,m-1),(j,j)))
            
        for i in range(m):
            for j in range(n):
                if board[i][j]=="O":
                    board[i][j]="X"
                if board[i][j]=="*":
                    board[i][j]="O"

解法2:

找到邊界上的O,對邊界上的每個O進行深度優先搜索(dfs)

用dfs找到與邊界聯通的O,將其改爲*,最後將O改爲X,將*改爲O

class Solution:
    def solve(self, board: List[List[str]]) -> None:
        """
        Do not return anything, modify board in-place instead.
        """
        if not board:
            return
        m,n=len(board),len(board[0])
        
        def _solve(i,j):
            if board[i][j]!="O":
                return
            
            stack=list()
            stack.append((i,j))

            while stack:
                x,y=stack[-1]
                board[x][y]="*"
                directions=[(-1,0),(1,0),(0,-1),(0,1)]
                for d in directions:
                    nx=x+d[0]
                    ny=y+d[1]
                    if 0<=nx<m-1 and 0<=ny<n-1 and board[nx][ny]=="O":
                        stack.append((nx,ny))
                        break
                if (x,y)==(stack[-1]):
                    stack.pop()
             
                  
        for i in range(m):
            list(map(_solve,(i,i),(0,n-1)))
            
        for j in range(n):
            list(map(_solve,(0,m-1),(j,j)))
            
        for i in range(m):
            for j in range(n):
                if board[i][j]=="O":
                    board[i][j]="X"
                if board[i][j]=="*":
                    board[i][j]="O"


 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章