0%

Atcoder Panasonic Programming Contest 2020 F Fractal Shortest Path

observation

阶分形的第一列、最后一列、第一行、最后一行都是白色的格子。

lemma

对于一个 阶分形,从其中的任意一个点走到这个分形的右下角的最短路长度为这两个点的曼哈顿距离。

证明:考虑归纳,对于 显然成立;当结论对于 成立时,构造 阶分形中的行走方案:先走到点所属的 阶分形的右下角,然后沿着其它 阶分形的边缘走过去即可。

solution

将当前的图分为八个部分:

1
2
3
A B C
D x E
F G H

如果两个点不在同一行或者同一列,那么它们之间的最短路就是它们之间的曼哈顿距离(与 lemma 证明类似构造)。

如果两个点都在 B x G 这一列或者都在 D x E 这一行(以 B x G 为例):最短路径要么是(起点 -> B 的左下角 -> G 的左上角 -> 终点),要么是(起点 -> B 的右下角 -> G 的右上角 -> 终点)。可以直接算出来。

否则两个点在同一行或者同一列,并且之间全部是 阶分形。递归下去做即可。

为了减少讨论量,可以在初始的时候令点的横坐标绝对值之差大于纵坐标绝对值之差。

Code

link