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: