【多源BFS问题】01 矩阵

发布于:2025-03-22 ⋅ 阅读:(17) ⋅ 点赞:(0)

在计算机科学中,01矩阵通常指的是一个只包含0和1的矩阵。在处理这类矩阵时,特别是在图或网格结构中,广度优先搜索(BFS)是一种非常有效的算法。当我们遇到多源BFS问题时,即在矩阵中从多个位置同时开始搜索时,我们可以采用一些策略来有效地实现。

1. 定义问题

假设你有一个01矩阵,其中0表示可以走过的位置,1表示障碍物(不能走)。你的任务是从矩阵中的多个起点开始,计算到所有可达位置的最近距离。

2. 使用队列进行多源BFS

为了实现多源BFS,你可以使用一个队列来存储每个起点及其初始状态(通常是距离为0)。然后,你可以按照标准的BFS方式扩展这个队列。

3. 代码实现

以下是一个使用Python实现的示例代码:

from collections import deque

def multi_source_bfs(matrix):

    if not matrix or not matrix[0]:

        return []

    

    rows, cols = len(matrix), len(matrix[0])

    queue = deque()

    distances = [[float('inf')] * cols for _ in range(rows)]  # 初始化距离矩阵为无穷大

    directions = [(0, 1), (0, -1), (1, 0), (-1, 0)]  # 右、左、下、上

    

    # 将所有起点加入队列,并设置其距离为0

    for i in range(rows):

        for j in range(cols):

            if matrix[i][j] == 0:  # 起点标记为0

                queue.append((i, j))

                distances[i][j] = 0

    

    while queue:

        x, y = queue.popleft()

        for dx, dy in directions:

            nx, ny = x + dx, y + dy

            if 0 <= nx < rows and 0 <= ny < cols and matrix[nx][ny] == 0 and distances[nx][ny] > distances[x][y] + 1:

                distances[nx][ny] = distances[x][y] + 1

                queue.append((nx, ny))

    

    return distances

# 示例矩阵

matrix = [

    [0, 0, 0],

    [0, 1, 0],

    [0, 0, 0]

]

print(multi_source_bfs(matrix))

4. 解释代码

初始化:创建一个队列来存储起点位置,并初始化一个距离矩阵distances,其中所有值初始化为无穷大。起点位置的距离设为0。

BFS过程:在BFS过程中,对于队列中的每个点,检查其四个可能的移动方向(上下左右)。如果移动后的位置是有效的(在矩阵范围内且是可走的),并且通过当前路径到达该位置的距离比之前记录的距离更短,则更新该位置的距离并将它加入队列。

结果:返回最终的distances矩阵,其中包含了从所有起点到每个可达点的最短距离。

这个方法可以有效地处理多源BFS问题,并适用于各种类型的网格或图结构。