如何计算网格中两点之间的最短路径
我知道有很多算法可用于计算图形或网格中两点之间的路径" title="最短路径">最短路径,例如广度优先的全对(Floyd’s),Dijkstra的。
但是,正如我注意到的那样,所有这些算法都会计算该图或网格中的所有路径,而不仅是我们感兴趣的两点之间的路径。
我的问题是:
如果我有一个网格,即一个二维数组,并且我有兴趣计算两个点(例如P1和P2)之间的最短路径,并且我在网格上的移动方式是否受到限制(例如仅对角线,或者仅对角线和向上等),什么算法可以计算出来?
请帮助我,我已经考虑了好几个月了!
好的家伙,我在TOPCODER.COM的网格中找到了该算法,您只能(对角向上)移动,但我不知道这是什么算法,谁能知道?
#include<iostream>#include <cmath>
using namespace std;
inline int Calc(int x,int y)
{
if(abs(x)>=abs(y)) return abs(x);
int z=(abs(x)+abs(y))/2;
return z+abs(abs(x)-z);
}
class SliverDistance
{
public:
int minSteps(int x1,int y1, int x2, int y2)
{
int ret=0;
if(((x1+y1)&1)!=((x2+y2)&1))y1++,ret++;
return ret+Calc(x2-x1,y2-y1);
}
};
回答:
Lee的算法:http :
//en.wikipedia.org/wiki/Lee_algorithm
本质上是BF搜索,下面是一个示例:http : //www.oop.rwth-aachen.de/documents/oop-2007/sss-
oop-2007.pdf
例如,如果您有一个网格,其中* =障碍物,则可以向上,向下,向左和向右移动,并且从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可能会获胜。
以上是 如何计算网格中两点之间的最短路径 的全部内容, 来源链接: utcz.com/qa/397428.html