📅  最后修改于: 2023-12-03 15:36:26.747000             🧑  作者: Mango
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 的未访问位置时,将其加入队列并将其标记为已访问。
执行以下操作,直到队列为空:
当队列为空时,表示已经遍历了整个岛屿。统计被遍历的次数,即为岛屿数量。
下面是一个用 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