python-leetcode-130-被围绕的区域

**题号: **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

解释:

被围绕的区间不会存在于边界上,换句话说,任何边界上的 'O' 都不会被填充为 'X'。 任何不在边界上,或不与边界上的 'O' 相连的
'O' 最终都会被填充为 'X'。如果两个元素在水平或垂直方向相邻,则称它们是"相连"的。

class Solution:
    def solve(self, board):
        """
        :type board: List[List[str]]
        :rtype: void Do not return anything, modify board in-place instead.
        """
        if board:
            queue = []
            for index, i in enumerate(board[0]):
                if i == "O":
                    board[0][index] = "-"
                    queue.append([0, index])
            for index, i in enumerate(board[-1]):
                if i == "O":
                    board[len(board) - 1][index] = "-"
                    queue.append([len(board) - 1, index])
            for i in range(len(board)):
                if board[i][0] == "O":
                    board[i][0] = "-"
                    queue.append([i, 0])
            for i in range(len(board)):
                if board[i][-1] == "O":
                    board[i][len(board[0]) - 1] = "-"
                    queue.append([i, len(board[0]) - 1])
            while queue:
                top = queue.pop(0)
                x, y = top[0], top[1]
                # 上下左右添加
                if x - 1 > 0 and board[x - 1][y] == "O":
                    board[x - 1][y] = "-"
                    queue.append([x - 1, y])
                if x + 1 < len(board) and board[x + 1][y] == "O":
                    board[x + 1][y] = "-"
                    queue.append([x + 1, y])
                if y - 1 > 0 and board[x][y - 1] == "O":
                    board[x][y - 1] = "-"
                    queue.append([x, y - 1])
                if y + 1 < len(board[0]) and board[x][y + 1] == "O":
                    board[x][y + 1] = "-"
                    queue.append([x, y + 1])
            for i in range(len(board)):
                for j in range(len(board[0])):
                    if board[i][j] == "O":
                        board[i][j] = "X"
                    if board[i][j] == "-":
                        board[i][j] = "O"

分析:
边上的O是安全的,从边上的O蔓延过去与它相连的O也是安全的

遍历四条边把安全的O标记出来,然后把所有未标记的O改X

总结:还是得多刷题,才能更有感觉!

发布了46 篇原创文章 · 获赞 9 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/SMith7412/article/details/88563826