📜  使用 BFS 的图表中的岛屿(1)

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

使用 BFS 的图表中的岛屿

什么是 BFS?

BFS(广度优先搜索)是一种图遍历算法,适用于使用队列以广度优先的方式遍历图的情况。BFS 通常用于找到两个节点之间的最短路径。

什么是图?

在计算机科学中,图是由节点和边组成的数据结构。每个节点都可以与任何其他节点(除了它本身)通过边相连,这些节点被称为“邻居”。

图有两种主要类型:有向图和无向图。在有向图中,边是有方向的,而在无向图中,边是无方向的。在本文中,我们将使用无向图。

如何表示图?

可以使用邻接矩阵或邻接列表来表示图。

邻接矩阵

邻接矩阵是一个二维数组,其中行表示源节点,列表示目标节点,相应的元素指示源节点是否与目标节点相连。

例如,下面是一个用邻接矩阵表示的图:

   A  B  C
A  0  1  1
B  1  0  1
C  1  1  0
邻接列表

邻接列表是一个数组,其中每个节点指向一个包含其所有邻居节点的列表。

例如,下面是一个用邻接列表表示的图:

{
  "A": ["B", "C"],
  "B": ["A", "C"],
  "C": ["A", "B"]
}
如何使用 BFS 遍历一个图?
步骤1:初始化

将起始节点加入队列,并将其标记为已访问。

步骤2:执行 BFS

执行以下操作,直到队列为空:

  1. 取出队列的第一个节点并访问它。
  2. 获取该节点的所有未访问邻居,并将它们加入队列并标记为已访问。
步骤3:结束

当队列为空时,表示已经遍历了所有节点。

如何使用 BFS 查找图中的岛屿?

在图中,被相邻的水平或垂直的位置包围的区域,被称为一个岛屿。我们可以使用 BFS 在一个二维数组中查找岛屿。

步骤1:初始化

遍历整个二维数组,当发现一个值为 1 的未访问位置时,将其加入队列并将其标记为已访问。

步骤2:执行 BFS

执行以下操作,直到队列为空:

  1. 取出队列的第一个节点,并将其值设为 0。
  2. 获取该节点的所有未访问且值为 1 的邻居,并将它们加入队列,并将它们标记为已访问。
步骤3:统计岛屿数量

当队列为空时,表示已经遍历了整个岛屿。统计被遍历的次数,即为岛屿数量。

示例代码

下面是一个用 Python 实现的 BFS 查找岛屿的示例代码:

from collections import deque

def bfs(matrix):
    ROW, COL = len(matrix), len(matrix[0])
    visited = set()
    islands = 0
    directions = [(0, 1), (0, -1), (1, 0), (-1, 0)]
    for r in range(ROW):
        for c in range(COL):
            if matrix[r][c] == 1 and (r, c) not in visited:
                islands += 1
                q = deque([(r, c)])
                visited.add((r, c))
                while q:
                    curr_r, curr_c = q.popleft()
                    for dr, dc in directions:
                        next_r, next_c = curr_r + dr, curr_c + dc
                        if 0 <= next_r < ROW and 0 <= next_c < COL and matrix[next_r][next_c] == 1 and (next_r, next_c) not in visited:
                            q.append((next_r, next_c))
                            visited.add((next_r, next_c))
                print(f"Island {islands}")

matrix = [
    [1,1,0,0,0],
    [1,1,0,0,0],
    [0,0,1,0,0],
    [0,0,0,1,1]
]

bfs(matrix)

运行结果如下:

Island 1
Island 2
Island 3