我有一个程序可以创建一个类似于此的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点。对象的要点是到达边缘,我想在那里找到最短的路径。
答案 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可能会赢。
对任何起点和终点执行此操作,并选择具有最小整数的端点。