Traveling in the grid world
题目描述
有一个 (n imes m) 的格点图,两点之间走他们的连线,但是这条连线不能恰好覆盖其他整点。还要求相邻两步之间的连线不能斜率相同,求从 ((0,0)) 走到 ((n,m)) 的最短距离。
(1leq n,mleq 10^6)
解法
首先考虑一种特殊情形:(gcd(n,m)=1) ,就说明起点到终点的连线就是答案。
从大体上看,由于走的是直线,所以我们希望折线的次数越少越好(有点感性)。我们考虑只折一次的最优解是什么,可以画图分析:
假设在 (A,B) 的路径中的拐点是 (C) ,那么如果 (AC) 之间出现了一个整点 (D) 怎么办呢?我们发现由于三角形两边之和大于第三边,此时选 (D) 做为拐点一定最优,那么一直这样调整。如果 (C) 是最短路径的一个拐点,那么他一定是满足条件的,所以最短即合法 。(BC) 段可以用类似的方法来调整,最后的状态一定两边都没有整点。
那么我们如何说明最优解是只折一次呢?假设多段折线最优,可以取多段折线第一段作为 (AC) 段,然后连接 (BC) ,总长度一定是比多段折线要小的。如果不合法呢?那调整会得到更小的结果,所以与我们的假设矛盾,反证法证明成功。