返回

横扫四方:用 BFS 算法征服岛屿计数难题

前端

导语

面对浩瀚无垠的海洋,星罗棋布的岛屿若隐若现,勾勒出一幅幅令人着迷的图景。然而,如何准确统计这些岛屿的数量却是一项艰巨的挑战。今天,我们将踏上征途,挥舞着 BFS 算法这柄锋利宝剑,劈荆斩棘,直捣岛屿计数的难题。

BFS 算法:横扫四方,所向披靡

BFS,即广度优先搜索,是一种遍历图结构的经典算法。它从一个起始点出发,逐步探索与之相邻的节点,犹如一圈圈涟漪向外扩散,直至遍历完整个图。在岛屿计数问题中,我们将把海洋视为图中的节点,而岛屿则看作是连通的节点集合。

算法流程:步步为营,逐岛清点

  1. 初始化: 将每个海洋节点标记为未访问。
  2. 遍历海洋: 从任意一个海洋节点出发,进行 BFS 遍历。
  3. 发现岛屿: 如果 BFS 过程中遇到未访问过的海洋节点,则表明找到了一个新的岛屿。
  4. 标记岛屿: 将新发现的岛屿上的所有海洋节点标记为已访问,以避免重复计数。
  5. 岛屿计数器: 每发现一个新岛屿,就将岛屿计数器加 1。
  6. 遍历完成: 直至遍历完所有海洋节点,岛屿计数器中的值即为岛屿总数。

代码实现:Python 大显神威

def num_islands(grid):
  """
  :type grid: List[List[str]]
  :rtype: int
  """
  if not grid:
    return 0

  # 初始化海洋节点标记为未访问
  visited = [[False] * len(grid[0]) for _ in range(len(grid))]

  # 岛屿计数器
  island_count = 0

  # 遍历海洋,发现岛屿
  for i in range(len(grid)):
    for j in range(len(grid[0])):
      if not visited[i][j] and grid[i][j] == '1':
        # 发现新岛屿,岛屿计数器加 1
        island_count += 1
        # 广度优先搜索标记岛屿
        bfs(grid, visited, i, j)

  return island_count

def bfs(grid, visited, i, j):
  # 超出边界或已访问,直接返回
  if i < 0 or i >= len(grid) or j < 0 or j >= len(grid[0]) or visited[i][j]:
    return

  # 未访问的海洋节点,标记为已访问
  visited[i][j] = True

  # 继续探索相邻节点(上、下、左、右)
  bfs(grid, visited, i + 1, j)
  bfs(grid, visited, i - 1, j)
  bfs(grid, visited, i, j + 1)
  bfs(grid, visited, i, j - 1)

实战演练:代码检验真章

下面我们来看一个示例,检验代码的威力:

grid = [
  ["1","1","0","0","0"],
  ["1","1","0","0","0"],
  ["0","0","1","0","0"],
  ["0","0","0","1","1"]
]
print(num_islands(grid))  # 3

通过代码的考验,我们成功统计出示例中的岛屿数量为 3,完美达成任务!

总结

BFS 算法以其横扫四方的气势,为我们征服岛屿计数难题铺平了道路。通过一步步发现岛屿并将其标记,最终将所有岛屿收入囊中。这趟征程不仅展现了算法的强大威力,也让我们领略了浩瀚海洋中岛屿的独特魅力。未来,让我们继续扬帆远航,探索算法世界更多未知的宝藏!