477. 被围绕的区域

477. 被围绕的区域

中文English

给一个二维的矩阵,包含 'X' 和 'O', 找到所有被 'X' 围绕的区域,并用 'X' 替换其中所有的 'O'

样例

样例 1:

输入:
  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

样例 2:

输入: 
  X X X X
  X O O X
  X O O X
  X O X X
输出: 
  X X X X
  X O O X
  X O O X
  X O X X
输入测试数据 (每行一个参数)如何理解测试数据?

 DFS + 边界寻找 O 替换 T

O替换X,T替换O

class Solution:
    """
    @param: board: board a 2D board containing 'X' and 'O'
    @return: nothing
    """
    def surroundedRegions(self, board):
        # write your code here
        if not board: return


        #初始化
        n, m = len(board), len(board[0])

        def dfs(x, y):
            if (x < 0 or x > n - 1 or y < 0 or y > m - 1):
                return
            
            if board[x][y] == 'O':
                board[x][y] = 'T'
            
                dfs(x - 1, y)
                dfs(x + 1, y)
                dfs(x, y - 1)
                dfs(x, y + 1)


        #找寻边界,如果满足边界 and 为0,则dfs找到上下左右的,换T
        #此时j为0和m - 1
        for i in range(n):
            if (board[i][0] == 'O'):
                dfs(i, 0)
            if (board[i][m - 1] == 'O'):
                dfs(i, m - 1)
        
        for j in range(m):
            if (board[0][j] == 'O'):
                dfs(0, j)
            if (board[n - 1][j] == 'O'):
                dfs(n - 1, j)
            
        
        #然后循环m和n,依次将O转换为X,并且T转换为O
        for i in range(n):
            for j in range(m):
                if (board[i][j] == 'O'):
                    #board[i] = board[i].replace(board[i][j], 'X', 1)
                    board[i][j] = 'X'
                elif (board[i][j] == 'T'):
                    board[i][j] = 'O'
                    #board[i] = board[i].replace(board[i][j], 'O', 1)

        return board

 

BFS写法 + 边界查找 替换法

class Solution:
    """
    @param: board: board a 2D board containing 'X' and 'O'
    @return: nothing
    """
    def surroundedRegions(self, board):
        # write your code here
        #BFS写法,每次只fill一次,查询一次,符合则替换,最终返回结果
        if not board: return
    
        m, n = len(board[0]), len(board)
        queue = []
                
        def fill(x, y):
            if (x < 0 or x > n - 1 or y < 0 or y > m - 1):
                return
            
            if (board[x][y] == 'O'):
                board[x][y] = 'T'
                queue.append([x, y])
                
        
        def bfs(x ,y):
            fill(x, y)
        
            while queue:
                curr = queue.pop(0)
                x, y = curr[0], curr[1]
                
                fill(x + 1, y)
                fill(x - 1, y)
                fill(x, y + 1)
                fill(x, y - 1)
                

        #边界查找
        #X轴查找
        for i in range(n):
            if (board[i][0] == 'O'):
                bfs(i ,0)
            if (board[i][m - 1] == 'O'):
                bfs(i, m - 1)
                
        #Y轴查找
        for j in range(m):
            if (board[0][j] == 'O'):
                bfs(0, j)
            if (board[n - 1][j] == 'O'):
                bfs(n - 1, j)
        
        #最终替换
        for i in range(m):
            for j in range(n):
                if (board[j][i] == 'O'):
                    board[j][i] = 'X'
                elif (board[j][i] == 'T'):
                    board[j][i] = 'O'
        
        return board
                

 

posted @ 2020-07-04 19:15  风不再来  阅读(140)  评论(0编辑  收藏  举报