在网格上实现类 Dijkstra 算法
Implementing Dijkstra-like algorithm on grid
我正在尝试编写一种在网格上运行的算法。它与Dijkstra的算法类似,但略有不同。
网格中的每个点都被占用或空闲。我想检查距离起点小于一定距离的所有可达点。
我假设我可以分别以 1 和 sqrt(2) 的成本平行于网格线或沿对角线行进。
最简单的方法是如果我有一个按值排序的地图。这样我就可以将键设置为每个点的坐标,并将值设置为到目前为止计算的到该点的距离。我只需要弹出距离最小的条目,然后找到并更新邻居点的到目前为止的距离。
这样的容器不存在,所以我一直在考虑可以组合哪些容器以提供相同的行为,但我无法想出任何可行的方法。
我在想我可以有一个 unordered_set 或 unordered_map 允许快速检索每个点的到目前为止的距离。对于 unordered_set 我可以定义一个 gridNode 对象,它包含点的位置和到目前为止的距离。
然后,我可以得到一个向量,我可以对它进行排序并使用它来找到最短距离。
我只是不确定如何使这两个容器保持一致。向量是否包含指向 unordered_set 中条目的指针?向量是否可以包含网格点的坐标,我可以写 std::sort 以便它使用 unordered_map 正确排序?
如有任何想法,我们将不胜感激。
在处理 Dijkstra 和类似 Dijkstra 的算法时,priority queues are your friend. Standard C++ provides one implementation with std::priority_queue
。您必须存储成对的坐标和距离,并定义一个仅比较成对值的自定义比较器。
我正在尝试编写一种在网格上运行的算法。它与Dijkstra的算法类似,但略有不同。
网格中的每个点都被占用或空闲。我想检查距离起点小于一定距离的所有可达点。
我假设我可以分别以 1 和 sqrt(2) 的成本平行于网格线或沿对角线行进。
最简单的方法是如果我有一个按值排序的地图。这样我就可以将键设置为每个点的坐标,并将值设置为到目前为止计算的到该点的距离。我只需要弹出距离最小的条目,然后找到并更新邻居点的到目前为止的距离。
这样的容器不存在,所以我一直在考虑可以组合哪些容器以提供相同的行为,但我无法想出任何可行的方法。
我在想我可以有一个 unordered_set 或 unordered_map 允许快速检索每个点的到目前为止的距离。对于 unordered_set 我可以定义一个 gridNode 对象,它包含点的位置和到目前为止的距离。
然后,我可以得到一个向量,我可以对它进行排序并使用它来找到最短距离。
我只是不确定如何使这两个容器保持一致。向量是否包含指向 unordered_set 中条目的指针?向量是否可以包含网格点的坐标,我可以写 std::sort 以便它使用 unordered_map 正确排序?
如有任何想法,我们将不胜感激。
在处理 Dijkstra 和类似 Dijkstra 的算法时,priority queues are your friend. Standard C++ provides one implementation with std::priority_queue
。您必须存储成对的坐标和距离,并定义一个仅比较成对值的自定义比较器。