我知道有很多算法可用于计算图形或网格中两点之间的最短路径,例如广度优先的全对(Floyd’s),Dijkstra的。
但是,正如我注意到的那样,所有这些算法都会计算该图或网格中的所有路径,而不仅是我们感兴趣的两点之间的路径。
我的问题是: 如果我有一个网格,即一个二维数组,并且我有兴趣计算两个点(例如P1和P2)之间的最短路径,并且我在网格上的移动方式是否受到限制(例如仅对角线,或者仅对角线和向上等),什么算法可以计算出来?
请注意,如果您有答案,我希望您发布算法的名称,而不是算法本身(当然,如果您还发布算法,那就更好了); 例如,它是Dijkstra的算法,还是Floyd的算法,等等。
请帮助我,我已经考虑了好几个月了!
好的家伙,我在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可能会获胜。