📌  相关文章
📜  访问从源到最终顶点的每个坐标所覆盖的最小曼哈顿距离(1)

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

访问从源到最终顶点的每个坐标所覆盖的最小曼哈顿距离

概述

曼哈顿距离是指在直角坐标系中,两点在横纵坐标上的距离之和。本篇介绍如何计算从源点到任意一个顶点的曼哈顿距离,并返回从源点到各个顶点曼哈顿距离的最小值。

算法

本算法基于BFS(宽度优先搜索)实现,其思路如下:

  1. 创建队列,并将源点入队。
  2. 若队列非空,则取出队首元素,并将该元素的所有未访问邻居入队。同时,将新入队的邻居的曼哈顿距离设置为该元素的曼哈顿距离加上1。
  3. 重复执行2,直到队列为空。
  4. 遍历所有顶点,获取每个顶点的曼哈顿距离数组,取出最小值。
实现

以下是基于Python的实现代码片段:

from collections import deque

def min_manhattan_distance(grid: List[List[int]], start: Tuple[int, int], end: Tuple[int, int]) -> int:
    m, n = len(grid), len(grid[0])
    distances = [[float('inf')] * n for _ in range(m)]
    queue = deque([start])
    distances[start[0]][start[1]] = 0

    while queue:
        row, col = queue.popleft()
        for r, c in [(0, 1), (0, -1), (1, 0), (-1, 0)]:
            new_row, new_col = row + r, col + c
            if 0 <= new_row < m and 0 <= new_col < n and distances[new_row][new_col] == float('inf') and grid[new_row][new_col] == 0:
                distances[new_row][new_col] = distances[row][col] + 1
                queue.append((new_row, new_col))

    return distances[end[0]][end[1]]
示例

假设有如下迷宫:

maze = [
    [0, 0, 0, 0],
    [0, 1, 1, 0],
    [0, 1, 1, 0],
    [0, 0, 0, 0]
]

其中0表示可以通过,1表示不能通过。若起点为(0, 0),终点为(3, 3),则调用min_manhattan_distance函数计算得到从起点到终点的最小曼哈顿距离为6。

总结

本篇介绍了如何计算从源点到任意一个顶点的曼哈顿距离,并返回从源点到各个顶点曼哈顿距离的最小值的算法实现。该算法基于BFS思路实现,适用于非加权图或所有边权值相等的加权图。