一尘不染

如何计算网格中两点之间的最短路径

algorithm

我知道有很多算法可用于计算图形或网格中两点之间的最短路径,例如广度优先的全对(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);
}
};

阅读 415

收藏
2020-07-28

共1个答案

一尘不染

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

2020-07-28