📌  相关文章
📜  给定矩阵“ O”和“ X”,如果被“ X”包围,则将“ O”替换为“ X”(1)

📅  最后修改于: 2023-12-03 15:11:40.526000             🧑  作者: Mango

给定矩阵"O"和"X",如果被"X"包围,则将"O"替换为"X"

问题描述

给定一个二维矩阵,其中包含"O"和"X"两种字符。将被"X"包围的"O"替换成"X"。

被"X"包围的条件是:

  • "O"必须被"X"包围,或者与边界相邻
  • "X"不能被"O"包围

示例:

输入:
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"相邻的"O"标记为"#"。
  • 遍历第一列和最后一列,将与"O"相邻的"O"标记为"#"。
  • 用"#"替换掉矩阵中的"O"。
  • 将所有的"#"替换成"O"。
代码实现
def solve(board):
    if not board:
        return []

    m, n = len(board), len(board[0])

    def dfs(i, j):
        if i < 0 or i >= m or j < 0 or j >= n or board[i][j] != "O":
            return
        board[i][j] = "#"
        dfs(i-1, j)
        dfs(i+1, j)
        dfs(i, j-1)
        dfs(i, j+1)

    # 遍历第一行和最后一行
    for j in range(n):
        dfs(0, j)
        dfs(m-1, j)

    # 遍历第一列和最后一列
    for i in range(m):
        dfs(i, 0)
        dfs(i, n-1)

    # 用"#"替换掉矩阵中的"O"
    for i in range(m):
        for j in range(n):
            if board[i][j] == "O":
                board[i][j] = "X"

    # 将所有的"#"替换成"O"
    for i in range(m):
        for j in range(n):
            if board[i][j] == "#":
                board[i][j] = "O"

    return board
复杂度分析
  • 时间复杂度:$O(mn)$,其中$m$为矩阵的行数,$n$为矩阵的列数。遍历矩阵需要$O(mn)$的时间复杂度。对于每个被标记的格子,需要进行深度优先搜索,搜索的时间复杂度为$O(1)$。
  • 空间复杂度:$O(mn)$。深度优先搜索需要使用递归栈,递归栈的深度最坏情况下为$O(mn)$,因此空间复杂度为$O(mn)$。