二次元平面上で旅行をしようとしているシカのAtCoDeerくんのプランが、実行可能かどうか判定する問題です。
提出
n = int(input())
txy=[list(map(int,input().split())) for _ in range(n)]
p = [0,0,0]
for i in range(n):
step = abs(txy[i][1]-p[1])+abs(txy[i][2]-p[2])
time = txy[i][0]-p[0]
if time>=step and (time-step)%2 == 0:
p = txy[i]
continue
else:
print("No")
exit(0)
print("Yes")
入力したti , xi, yi は二重のリストにしています。
最初は、時刻 0 に 点 (0,0)にいるため、要素が0のリストpを作成します。
時刻 ti にいる点(xi, yi)が、一つ前の ti-1 の点(xi-1, yi-1)から、どのくらい進んだのかを計算して step に入れます。abs() は絶対値を返します。
その間に経過した時間 time は「ti – ti-1」となります。
時間が1進むごとに、どれかの方向に1しか進めないため、プランが実行可能であるには、「time>=step」となる必要があります。
また、「その場にとどまることは出来ない」という条件から、時間 time が偶数であれば、進んだ step も偶数でなくてはいけないため( time が奇数の場合には step も奇数)、「 (time-step)%2 == 0」も、必須条件です。
この二つを満たしたものであれば、実行可能ですので、リストpに今の「ti, xi, yi」を入れて、ループ処理を続けます。
どちらか一方でも満たさない場合には、実現不可能なので「No」を出力して、プログラムを終了させます。