ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

【网格问题】leetcode130.被围绕的区域

2022-02-09 11:32:02  阅读:134  来源: 互联网

标签:边界 围绕 List 网格 len leetcode130 def board append


题目:
给你一个 m x n 的矩阵 board ,由若干字符 ‘X’ 和 ‘O’ ,找到所有被 ‘X’ 围绕的区域,并将这些区域里所有的 ‘O’ 用 ‘X’ 填充。
在这里插入图片描述
在这里插入图片描述
解答:
方法一:BFS

class Solution:
    def solve(self, board: List[List[str]]) -> None:
        """
        Do not return anything, modify board in-place instead.
        """       
        #BFS,从边界的O出发,将与边界O直接或间接相连的O,标记为'A'
        directions=[[-1,0],[1,0],[0,-1],[0,1]]
        q=deque()
        m=len(board)
        n=len(board[0])
        for i in range(m):
            if board[i][0]=='O':
                q.append((i,0))
            if board[i][n-1]=='O':
                q.append((i,n-1))
        for j in range(1,n-1):
            if board[0][j]=='O':
                q.append((0,j))
            if board[m-1][j]=='O':
                q.append((m-1,j))
        
        def InArea(i,j):
            if 0<=i<m and 0<=j<n:
                return True
            return False

        while q:
            x,y=q.popleft()
            board[x][y]='A'
            for dx,dy in directions:
                curx,cury=x+dx,y+dy
                if InArea(curx,cury) and board[curx][cury]=='O':
                    q.append((curx,cury))
        
        for i in range(m):
            for j in range(n):
                #被标记的还原为'O',未被标记的变换为'X'
                if board[i][j]=='A':
                    board[i][j]='O'
                elif board[i][j]=='O':
                    board[i][j]='X'
        return board

方法二:DFS

class Solution:
    def solve(self, board: List[List[str]]) -> None:
        """
        Do not return anything, modify board in-place instead.
        """       
        #DFS,从边界的O出发,将与边界O直接或间接相连的O,标记为'A'
        directions=[[-1,0],[1,0],[0,-1],[0,1]]
        m=len(board)
        n=len(board[0])

        def InArea(i,j):
            if 0<=i<m and 0<=j<n:
                return True
            return False

        def dfs(x, y):
            if not InArea(x,y) or board[x][y] != 'O':
                return
            #将当前位置标记为'A'
            board[x][y] = "A"
            for dx,dy in directions:
                dfs(x+dx,y+dy)
        
        #左边界和右边界
        for i in range(m):
            dfs(i, 0)
            dfs(i, n - 1)

        #上边界和下边界
        for j in range(1,n - 1):
            dfs(0, j)
            dfs(m - 1, j)
        
        #将被标记为A的还原为O,将未被标记的O替换为X
        for i in range(m):
            for j in range(n):
                if board[i][j] == "A":
                    board[i][j] = "O"
                elif board[i][j] == "O":
                    board[i][j] = "X"
        return board

标签:边界,围绕,List,网格,len,leetcode130,def,board,append
来源: https://blog.csdn.net/jqq125/article/details/122838115

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有