返回
横扫四方:用 BFS 算法征服岛屿计数难题
前端
2023-12-03 21:53:14
导语
面对浩瀚无垠的海洋,星罗棋布的岛屿若隐若现,勾勒出一幅幅令人着迷的图景。然而,如何准确统计这些岛屿的数量却是一项艰巨的挑战。今天,我们将踏上征途,挥舞着 BFS 算法这柄锋利宝剑,劈荆斩棘,直捣岛屿计数的难题。
BFS 算法:横扫四方,所向披靡
BFS,即广度优先搜索,是一种遍历图结构的经典算法。它从一个起始点出发,逐步探索与之相邻的节点,犹如一圈圈涟漪向外扩散,直至遍历完整个图。在岛屿计数问题中,我们将把海洋视为图中的节点,而岛屿则看作是连通的节点集合。
算法流程:步步为营,逐岛清点
- 初始化: 将每个海洋节点标记为未访问。
- 遍历海洋: 从任意一个海洋节点出发,进行 BFS 遍历。
- 发现岛屿: 如果 BFS 过程中遇到未访问过的海洋节点,则表明找到了一个新的岛屿。
- 标记岛屿: 将新发现的岛屿上的所有海洋节点标记为已访问,以避免重复计数。
- 岛屿计数器: 每发现一个新岛屿,就将岛屿计数器加 1。
- 遍历完成: 直至遍历完所有海洋节点,岛屿计数器中的值即为岛屿总数。
代码实现: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 算法以其横扫四方的气势,为我们征服岛屿计数难题铺平了道路。通过一步步发现岛屿并将其标记,最终将所有岛屿收入囊中。这趟征程不仅展现了算法的强大威力,也让我们领略了浩瀚海洋中岛屿的独特魅力。未来,让我们继续扬帆远航,探索算法世界更多未知的宝藏!