其他分享
首页 > 其他分享> > c – 海克斯康计划中的最短路径?

c – 海克斯康计划中的最短路径?

作者:互联网

在最新的IEEE Xtreme竞赛中,我试图解决的一个问题是,

输入两点p1(x1,y1),p2(x2,y2)你必须找到从p1到p2的最短路径长度,

例如,如果p1(1,1),p2(4,4)那么最短路径的长度为9个边缘,

我做了像深度优先搜索这样的东西,如果两点之间的距离很小,那么效果很好,并且例如对于点(1,1)和…而言需要很长时间. (10,10),

并且最大点的点数有限(12,12).

我的方法是将上面的图片转换为所有权重为1的无向图,然后找到最短路径.

这是我找到最短路径的函数:

int minCost;
vector<int> path;
multimap<int,int> Connections;
typedef multimap<int,int>::iterator mmit;

void shortestPath(int cs){
    if(cs > minCost)
        return;
    if(path.back() == Target){
        if(cs < minCost)
            minCost = cs;
        return;
    }

    pair<mmit,mmit> it = Connections.equal_range(path.back());
    mmit mit = it.first;

    for( ; mit != it.second ; ++mit){
        if(isVisited(mit->second))
            continue;
        markVisited(mit->second);
        path.push_back(mit->second);
        shortestPath(cs+1);
        markUnvisited(mit->second);
        path.pop_back();
    }
}

有没有比这更快的方法?我可以使用dijkstra这个无向图吗?

解决方法:

使用Dijkstra或任何类型的基于图形的搜索似乎完全过度杀伤.在每个顶点,您只需选择使您更接近目标的下一个顶点.

所以你从(1,1)的中心开始.您需要选择起始顶点.显然这是东南部的那个.

从那里,你有三个选择:向西移动,向东北移动或向东南移动.这实际上是您在每个第二个顶点的选择.您可以选择使您靠近的方向(即,与目标对向最小的角度).

事实上,你可以用一种欺骗性的方式表示你所有的顶点坐标.请注意,它们大致位于六边形坐标之间的中间位置.所以你可以说第一个顶点是(1.5,1.33).

你在第一个坐标上的可能动作是方向:

west       = (0, -0.67)
north-east = (-0.5, 0.33)
south-east = (0.5, 0.33)

让我们称之为奇怪的运动.现在,你有这些选择的偶数运动:

east       = (0, 0.67)
north-west = (-0.5, -0.33)
south-west = (0.5, -0.33)

所以你要做的就是,对于每个可能的方向,测试你的目标的新距离(如乌鸦飞 – 即毕达哥拉斯).选择三个选项中距离最小的新顶点.显然你不必计算实际距离 – 距离平方很好.

你可以弄清楚最初和最后的动作,我敢肯定.

最后一点,显然我正在使用不精确的双重算法.您可以将所有方向(当然还有六边形坐标)缩放6并使用整数.

标签:c,algorithm,shortest-path
来源: https://codeday.me/bug/20190901/1784301.html