📜  2D阵列上的广度优先遍历(BFS)(1)

📅  最后修改于: 2023-12-03 14:59:04.680000             🧑  作者: Mango

2D阵列上的广度优先遍历(BFS)

BFS (Breadth First Search),即广度优先搜索,是一种图形搜索算法,可以用于搜索最短路径或最小花费。在二维阵列上,BFS可以应用于查找从起点到终点的最短路径或查找从起点到所有其他点的最短路径。

BFS算法的基本思路是从起点开始,在离起点最近的节点中搜索终点。如果找到终点,则搜索停止。否则,继续向外扩展搜索,直到找到终点。

BFS算法可以使用队列来实现,每次从队列的头部取出一个节点作为当前节点进行搜索,将当前节点相邻的未被搜索过的节点加入队列尾部,直到队列为空或找到终点。

在二维阵列上实现BFS算法,可以使用坐标(x, y)来表示节点,使用数组来存储节点的状态和距离信息。

以下是Python示例代码:

from collections import deque

def bfs(start, end, grid):
    # 初始化状态和距离
    visited = [[False] * len(grid[0]) for _ in range(len(grid))]
    distance = [[0] * len(grid[0]) for _ in range(len(grid))]

    # 将起点加入队列
    queue = deque([(start[0], start[1])])
    visited[start[0]][start[1]] = True

    # BFS搜索
    while len(queue) > 0:
        x, y = queue.popleft()

        # 到达终点,停止搜索
        if x == end[0] and y == end[1]:
            break

        # 扩展搜索
        for dx, dy in [(0, -1), (0, 1), (-1, 0), (1, 0)]:
            nx, ny = x + dx, y + dy
            # 判断是否越界和是否已访问
            if nx >= 0 and nx < len(grid) and ny >= 0 and ny < len(grid[0]) and not visited[nx][ny]:
                # 更新状态和距离
                visited[nx][ny] = True
                distance[nx][ny] = distance[x][y] + 1
                # 将未访问的节点加入队列
                if grid[nx][ny] == 0:
                    queue.append((nx, ny))

    # 返回到达终点的距离
    return distance[end[0]][end[1]]

在以上代码中,grid是一个二维阵列,0表示可以访问的节点,1表示障碍物节点。start和end是起点和终点的坐标。函数返回start到end的最短距离。

BFS算法的时间复杂度为O(V+E),其中V是节点数量,E是边数量。在二维阵列上,节点数量为O(mn),边数量为O(mn),因此时间复杂度为O(mn)。空间复杂度为O(mn),需要存储节点状态和距离信息。