C - Tile Distance 2 Editorial by evima

別の説明

左下の頂点が \((x, y)\) であるようなタイルを \([x, y]\) と呼びます。

\((x + 0.5, y + 0.5)\) は、\(x\)\(y\) の偶奇が同じならタイル \([x, y]\) にあり、そうでないならタイル \([x - 1, y]\) にあります。以下、\([s_x, s_y]\) から \([t_x, t_y]\) への移動を考えます。

まず、\([s_x, s_y]\)\([t_x, t_y]\) をそれぞれ \((-s_x, -s_y)\) だけ平行移動すると、\([0, 0]\) から \([t_x-s_x, t_y-s_y]\) への移動を考えればよくなります。以下、\([0, 0]\) から \([x, y]\) への移動を考えます。

タイル \([0, 0]\) の中心を通って \(x\) 軸に平行な直線を考えると、敷き詰めはこの直線について対称です。よって、\(y < 0\) のときは代わりに \([0, 0]\) から \([x, -y]\) への移動を考えることで、\(y \geq 0\) を保証できます。同様に、\(x \geq 0\) を保証できます。

下の図を見てください。

\([0, 0]\) から \([x, y]\) に行くのに必要な最小のタイル間の移動回数は、右上方向と左上方向に合計 \(y\) 回の移動が必要であることに注目すると、\(y \geq x\) なら右方向の移動が不要なため \(y\) 回、そうでないなら右方向に \((x - y) / 2\) 回(この値は整数です)の移動が必要なため \(y + (x - y) / 2\) 回です。

実装例(Python)

Sx, Sy = map(int, input().split())
Tx, Ty = map(int, input().split())

Sx -= (Sy - Sx) % 2
Tx -= (Ty - Tx) % 2

Tx -= Sx
Ty -= Sy

Tx = abs(Tx)
Ty = abs(Ty)

print(Ty + max(0, Tx - Ty) // 2)

posted:
last update: