816 Shortest Distance Among Points

原题链接:https://projecteuler.net/problem=816

给定序列 令二维点序列是 表示 个点 任意不同的两点之间的最短距离。
比如 。这个可以小范围验证程序。

都是线性的,没啥问题。关键是如何求

如果使用暴力法,每两个之间都计算距离,那么需要 的时间开销, 是一个很大的值,不现实。

于是乎我想了一个比较朴素的方法。
对点按照 排序,如果一样就按照 排序。
对于某个点 ,只需要考虑坐标轴右边的点 和它的距离即可。
如果最小距离 已经比要考察的点 和点 的横坐标差值还小了,那么 右边的点都不需要计算了。

double distance = double.MaxValue;
for (int i = 0; i < P.Length - 1; i++)
{
    var p = P[i];
    for (int j = i + 1; j < P.Length; j++)
    {
        var other = P[j];
        if ((other.X - p.X) > distance)
        { break; }

        var d = p.Distance(other);
        if (d < distance)
        { distance = d; }
    }
}
跑了一下,速度很快,不到 1s 就能出结果~