如何在具有多个端点的二维数组中找到最短路径?
How to find the shortest path in 2D Array with multiple endpoints?
我有一个程序可以创建类似于此的二维数组:
X X X X X X X B X X
B X X X X X X X X X
B X X X X X X X X X
X X X X X X X B X X
X X X X X O B X X X
B X X X X X B X X X
X X X X X X X X X X
X X X X X X X X X X
X = 空 space 自由漫游
B = 无法自由漫游的封锁区域
O = 正在移动的对象
而且我想了解如何找到到任何端点的最短路径。通常我会使用 Dijkstra 算法,但是我有多个要考虑的点,而不是 1 个点。物体的点正在到达边缘,我想找到那里的最短路径。
李氏算法:http://en.wikipedia.org/wiki/Lee_algorithm
本质上是BF搜索,举个例子:http://www.oop.rwth-aachen.de/documents/oop-2007/sss-oop-2007.pdf
要有效地实施它,请查看:Change FloodFill-Algorithm to get Voronoi Territory for two data points? - 当我说标记时,你用你来自 + 1 的位置上的数字标记它。
例如,如果你有这个网格,其中a * =障碍物,你可以上下左右移动,你从S开始必须走到D,0 =自由位置:
S 0 0 0
* * 0 *
* 0 0 *
0 0 * *
* 0 0 D
您将 S 放入您的队列,然后 "expand" 它:
S 1 0 0
* * 0 *
* 0 0 *
0 0 * *
* 0 0 D
然后展开它所有的邻居:
S 1 2 0
* * 0 *
* 0 0 *
0 0 * *
* 0 0 D
所有这些邻居的邻居:
S 1 2 3
* * 3 *
* 0 0 *
0 0 * *
* 0 0 D
以此类推,最后你会得到:
S 1 2 3
* * 3 *
* 5 4 *
7 6 * *
* 7 8 9
因此从 S 到 D 的距离为 9。运行 时间为 O(NM),其中 N = 行数,M = 列数。我认为这是在网格上实现最简单的算法,而且在实践中也非常有效。它应该比经典的 dijkstra 更快,尽管如果您使用堆实现它,dijkstra 可能会获胜。
对任何起点和终点执行此操作,并根据您的情况选择整数最小的终点。
我有一个程序可以创建类似于此的二维数组:
X X X X X X X B X X
B X X X X X X X X X
B X X X X X X X X X
X X X X X X X B X X
X X X X X O B X X X
B X X X X X B X X X
X X X X X X X X X X
X X X X X X X X X X
X = 空 space 自由漫游
B = 无法自由漫游的封锁区域
O = 正在移动的对象
而且我想了解如何找到到任何端点的最短路径。通常我会使用 Dijkstra 算法,但是我有多个要考虑的点,而不是 1 个点。物体的点正在到达边缘,我想找到那里的最短路径。
李氏算法:http://en.wikipedia.org/wiki/Lee_algorithm
本质上是BF搜索,举个例子:http://www.oop.rwth-aachen.de/documents/oop-2007/sss-oop-2007.pdf
要有效地实施它,请查看:Change FloodFill-Algorithm to get Voronoi Territory for two data points? - 当我说标记时,你用你来自 + 1 的位置上的数字标记它。
例如,如果你有这个网格,其中a * =障碍物,你可以上下左右移动,你从S开始必须走到D,0 =自由位置:
S 0 0 0
* * 0 *
* 0 0 *
0 0 * *
* 0 0 D
您将 S 放入您的队列,然后 "expand" 它:
S 1 0 0
* * 0 *
* 0 0 *
0 0 * *
* 0 0 D
然后展开它所有的邻居:
S 1 2 0
* * 0 *
* 0 0 *
0 0 * *
* 0 0 D
所有这些邻居的邻居:
S 1 2 3
* * 3 *
* 0 0 *
0 0 * *
* 0 0 D
以此类推,最后你会得到:
S 1 2 3
* * 3 *
* 5 4 *
7 6 * *
* 7 8 9
因此从 S 到 D 的距离为 9。运行 时间为 O(NM),其中 N = 行数,M = 列数。我认为这是在网格上实现最简单的算法,而且在实践中也非常有效。它应该比经典的 dijkstra 更快,尽管如果您使用堆实现它,dijkstra 可能会获胜。
对任何起点和终点执行此操作,并根据您的情况选择整数最小的终点。