魔幻世界中的安全区计算| 豆包MarsCode AI刷题

109 阅读2分钟

深度优先搜索(DFS)在二维数组中的应用

问题背景

在解决某些问题时,我们需要在一个二维数组中找到所有连通的区域。例如,在一个表示危险程度的二维数组中,我们需要找到所有危险程度小于等于某个阈值的连通区域。这种问题通常可以通过深度优先搜索(DFS)或广度优先搜索(BFS)来解决。

数据结构选择

  • 二维数组 a:用于存储每个格子的危险程度。
  • 布尔类型的二维数组 visited:用于记录哪些格子已经被访问过,避免重复访问。

算法步骤

  1. 初始化

    • 创建一个与输入数组 a 相同大小的布尔数组 visited,并将其所有元素初始化为 False
    • 初始化一个计数器 safe_zones,用于记录安全区的数量。
  2. 遍历二维数组

    • 使用双重循环遍历二维数组 a 的每一个格子。
    • 对于每个格子,如果其危险程度小于等于阈值 X 且未被访问过,则从这个格子开始进行 DFS 搜索。
  3. DFS 实现

    • 从当前格子开始,递归地访问其上下左右四个方向的相邻格子。
    • 在每次递归中,检查边界条件(是否越界)和是否已经访问过。
    • 如果相邻格子是安全的且未被访问过,则继续递归。
    • 在每次递归中,标记当前格子为已访问。
  4. 计数安全区

    • 每次从新的未访问过的安全格子开始 DFS 时,计数器 safe_zones 加一。

代码示例

def solution(n: int, m: int, X: int, a: list[list[int]]) -> int:
    def dfs(x, y):
        # 检查边界条件和是否已经访问过
        if x < 0 or x >= n or y < 0 or y >= m or visited[x][y] or a[x][y] > X:
            return
        # 标记当前格子为已访问
        visited[x][y] = True
        # 递归访问相邻格子
        dfs(x + 1, y)
        dfs(x - 1, y)
        dfs(x, y + 1)
        dfs(x, y - 1)

    # 初始化访问标记数组
    visited = [[False] * m for _ in range(n)]
    safe_zones = 0

    # 遍历整个二维数组
    for i in range(n):
        for j in range(m):
            if a[i][j] <= X and not visited[i][j]:
                # 找到一个新的安全区
                safe_zones += 1
                dfs(i, j)

    return safe_zones

总结

  • DFS 是一种递归的搜索算法,适用于在二维数组中寻找连通区域。
  • visited 数组 用于避免重复访问,提高效率。
  • 边界检查 是确保递归不会越界的关键步骤。

通过上述步骤和代码示例,我们可以有效地计算出二维数组中所有连通的安全区域的数量。