LC130. 被围绕的区域

这篇博客主要介绍了如何利用深度优先搜索(DFS)和广度优先搜索(BFS)策略来解决一个二维数组中的特定元素替换问题。给定一个二维数组,目标是将所有与边界相连的'O'(水)标记为'A',然后将所有剩余的'O'标记为'X'。最后,将所有的'A'重新标记回'O'。博客通过两种不同的搜索算法实现这一过程,并提供了详细的代码实现。
摘要由CSDN通过智能技术生成

从四个边开始找O,找到了就找与其连通的区域。把它们换成其他的标记。
换完了之后遍历整个数组,把换掉的O换回来。把没换的O换成X

def solve(self, board):
        """
        :type board: List[List[str]]
        :rtype: None Do not return anything, modify board in-place instead.
        """
        def dfs(x, y):
            board[x][y] = "A"
            for nx, ny in [(x + 1, y) , (x - 1, y), (x, y + 1), (x, y - 1)]:
                if 0 <= nx < len(board) and 0 <= ny < len(board[0]) and board[nx][ny] == "O":
                    dfs(nx,ny)          #注意这里要递归找连通的部分
        for i in range(len(board)):
            if board[i][0] == "O":
                dfs(i,0)
            if board[i][len(board[0]) - 1] == "O":
                dfs(i, len(board[0]) - 1)
        for j in range(1, len(board[0]) - 1):
            if board[0][j] == "O":
                dfs(0, j)
            if board[len(board)-1][j] == "O":
                dfs(len(board) - 1, j)
        for ni in range(len(board)):
            for nj in range(len(board[0])):
                if board[ni][nj] == "O":
                    board[ni][nj] = "X"
                if board[ni][nj] == "A":
                    board[ni][nj] = "O"
        return board

广度优先做法

def solve(self, board):
        """
        :type board: List[List[str]]
        :rtype: None Do not return anything, modify board in-place instead.
        """
        r,c = len(board),len(board[0])
        queue = deque()
        for i in range(r):
            if board[i][0] == "O":
                queue.append((i,0))
            if  board[i][c-1] == "O":
                queue.append((i,c-1))
        for j in range(1,c-1):
            if board[0][j] == "O":
                queue.append((0,j))
            if board[r-1][j] == "O":
                queue.append((r-1,j))
        
        while queue:
            x,y = queue.popleft()
            board[x][y] = "A"
            for nx,ny in [(x+1,y),(x-1,y),(x,y+1),(x,y-1)]:
                if 0<= nx<r and 0<= ny < c and board[nx][ny] == "O":
                    queue.append((nx,ny))
        for i in range(r):
            for j in range(c):
                if board[i][j] == "A":
                    board[i][j] = "O"
                elif board[i][j] == "O":
                    board[i][j] = "X"
        return board
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值