如何在具有多个端点的2D阵列中找到最短路径?

时间:2015-03-05 22:44:13

标签: arrays algorithm shortest-path

我有一个程序可以创建一个类似于此的2D数组:

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 =可以自由漫游的空白空间

B =无法自由漫游的受阻区域

O =正在移动的对象

我想帮助找出如何找到任何终点的最短路径。通常我会使用Dijkstra算法但是我有多个要考虑的点而不是1点。对象的要点是到达边缘,我想在那里找到最短的路径。

1 个答案:

答案 0 :(得分:4)

Lee的算法: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。

例如,如果你有这个网格,其中一个* =障碍,你可以向上,向下,向左和向右移动,你从S开始,必须转到D,0 =自由位置:

S 0 0 0
* * 0 *
* 0 0 *
0 0 * *
* 0 0 D

您将S放入队列中,然后“展开”它:

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可能会赢。

对任何起点和终点执行此操作,并选择具有最小整数的端点。