第11話(最終話) 旅行
はじめに
こちらでは,競技プログラミングコンテストサイトAtCoderの常設コンテスト「AtCoder Beginners Selection」に筆者が挑戦します.記事には,筆者が作成したコード(使用言語はPython)と簡単な解説を載せますので,プログラミング初心者の方の参考になれば幸いです.なお,この記事では,Pythonの詳細な文法については解説致しませんので,そちらに関しては関連記事および文献等を参照して頂きたく存じます.
問題(ABC086C - Traveling)
シカのAtCoDeerくんは二次元平面上で旅行をしようとしています. AtCoDeerくんの旅行プランでは,時刻 0 に 点 (0,0) を出発し, 1 以上 N 以下の各 i に対し,時刻 t_iに 点 (xi,yi) を訪れる予定です.AtCoDeerくんが時刻 t に 点 (x,y) にいる時、,時刻 t+1 には 点 (x+1,y), (x−1,y), (x,y+1), (x,y−1) のうちいずれかに存在することができます. その場にとどまることは出来ないことに注意してください. AtCoDeerくんの旅行プランが実行可能かどうか判定してください.
コード(解答例)
N = int(input())
# 初期化 時刻0で点(0, 0)
old_t = 0
old_x, old_y = 0, 0
for i in range(N):
new_t, new_x, new_y = map(int, input().split())
time = new_t - old_t
dx, dy = new_x - old_x, new_y - old_y # 座標の変化
if time < abs(dx)+abs(dy) or (time+abs(dx)+abs(dy))%2 != 0:
print("No")
exit()
old_t = new_t
old_x, old_y = new_x, new_y
print("Yes")
解説
重要なポイントは2つです.1つ目は,与えられた時刻までにその座標にたどり着くことができるか,です.2つ目は,座標の変化と時刻の変化の偶奇が一致しているか,です.