返回

图中岛屿计数:探索算法王国中的孤立王国

前端

在计算机科学的浩瀚疆域中,图论占据着一席之地,它以优雅的抽象方式刻画了现实世界中的连接关系。图论的一个迷人应用便是计算图中的岛屿数量。想象一下一个棋盘,其中某些方格被占据,而其他方格是空的。我们的任务是确定空方格形成的孤立区域的数量,即岛屿。

算法探险

要计算图中岛屿的数量,我们可以采用两种经典算法:广度优先搜索 (BFS) 和深度优先搜索 (DFS)。这两种算法都通过遍历图中的节点来工作,并标记它们所属的岛屿。

BFS 算法中,我们从一个起始节点开始,并依次探索与其相邻的所有未访问节点。我们将这些节点标记为属于相同的岛屿。然后,我们重复此过程,直到遍历了整个图。

DFS 算法中,我们从一个起始节点开始,并沿着一条路径尽可能深入地遍历图。如果我们到达一个死胡同(即没有未访问的相邻节点),我们回溯并从另一条路径继续遍历。同样,我们将访问的节点标记为属于相同的岛屿。

实现细节

以下是使用 BFS 算法计算图中岛屿数量的 Python 代码示例:

def count_islands(grid):
  """
  计算图中岛屿的数量

  参数:
    grid:一个二维布尔数组,表示图中的节点,True 表示占据,False 表示空

  返回:
    岛屿数量
  """

  # 初始化岛屿计数器
  count = 0

  # 创建一个队列,用于存储待处理的节点
  queue = []

  # 遍历图中的所有节点
  for i in range(len(grid)):
    for j in range(len(grid[0])):
      # 如果节点为空,继续
      if not grid[i][j]:
        continue

      # 如果节点未被访问,则将其标记为已访问,并将其添加到队列中
      if not grid[i][j].visited:
        grid[i][j].visited = True
        queue.append((i, j))

      # 只要队列不为空,就继续处理节点
      while queue:
        # 从队列中取出一个节点
        x, y = queue.pop(0)

        # 访问该节点的相邻节点
        for dx, dy in [(1, 0), (-1, 0), (0, 1), (0, -1)]:
          # 计算相邻节点的坐标
          nx, ny = x + dx, y + dy

          # 检查相邻节点是否有效
          if 0 <= nx < len(grid) and 0 <= ny < len(grid[0]):
            # 如果相邻节点未被访问且为占据,将其添加到队列中
            if not grid[nx][ny].visited and grid[nx][ny]:
              grid[nx][ny].visited = True
              queue.append((nx, ny))

      # 完成对一个岛屿的访问,增加岛屿计数器
      count += 1

  # 返回岛屿数量
  return count

结语

计算图中岛屿数量的算法为我们提供了强大的工具,可以解决各种现实世界的连接问题。从图像处理到社交网络分析,这些算法为我们揭示数据的隐藏结构,从而做出明智的决策。踏入图论的奇异王国,发现算法的魔力吧!