テスターのふっぴーさん - yukicoder No. 1034
ソースコード
https://yukicoder.me/submissions/469576
n = , y = , x = とする
何周したかは, mi = min({y, n - 1- y, x, n - 1 - x})
その分のマス数は
a(k) = 2 * k + 2 * (k - 2) : 1 辺の長さが k のときの 1 周のマス数
として,
a(n) + a(n - 2) + ... + a(n - 2 * (mi - 1))
a(i) - a(i - 1) = 4 より, 等差数列の和
(項数) / 2 * (初項 + 末項)
あとは 4 回以内残った外周を動けば見つかる
別解 (公式解説)
ソースコード
https://yukicoder.me/submissions/468887
k 周したとして, そのマス数を求める
上に書いた等差数列の和
k / 2 * ( a(n) + a(n - 2 * (k - 1)) )
a(n) = 2 * n + 2 * (n - 2) = 2 * (2n - 2)
a(n - 2 * (k - 1)) = 2 * (n - 2 * (k - 1)) + 2 * (n - 2 * (k - 1) - 2))
= 2 * (n - 2 * (k - 1) + n - 2 * (k - 1) - 2)
= 2 * (2n - 4(k - 1) - 2)
(1) = k * (2n - 2 + 2n - 4(k - 1) - 2)
= k * (4n - 4(k - 1) - 4)
= 4k(n - k)
そのあと残ったマスの外周に沿って右下のマスに行く
今左上にいるから, 右に行って下に行く
1 辺の長さは n - 2k
n - 2k - 1 動くから, 2 * (n - 2k - 1)
そっから戻るか進むか
y = x の線より右上 (y < x) なら戻る
何周かした分を除いた外周なので, 単純に座標の差を見ればいい
((n - 1 - k) - y) + ((n - 1 - k) - x)