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

461 篇文章 1 订阅
125 篇文章 2 订阅

题目:
给你一个 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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值