(備忘録)AtCoderをやって6(Traveling)

問題

シカのAtCoDeerくんは二次元平面上で旅行をしようとしています。 AtCoDeerくんの旅行プランでは、時刻 0 に 点 (0,0) を出発し、 1 以上 N 以下の各 i に対し、時刻 t iに点 (x i、y i) を訪れる予定です。

AtCoDeerくんが時刻 t に 点 (x,y) にいる時、 時刻 t+1 には 点 (x+1,y), (x−1,y), (x,y+1), (x,y−1) のうちいずれかに存在することができます。 その場にとどまることは出来ないことに注意してください。 AtCoDeerくんの旅行プランが実行可能かどうか判定してください。 https://atcoder.jp/contests/abs/tasks/arc089_a (300 点)

自分の回答(他の方の解答参照)

自分で出来たところは、最初の4行くらいであとの処理部分は全く分からずでしたね。。。 解答を考える上でのポイントは、

  • 最短到着時刻(最短距離) (点(0,0)から上下右左のいずれかに移動できる場合の最短到着時刻はX+Yで求めることができる)

  • T(予定時刻) と X+Y(最短到着時刻)の偶数と奇数が一致するか(X+Y(最短到着時刻)の座標が偶数の場合、その座標にはどんなに遠回りしても偶数になる性質があり)

詳しい説明はこちらが分かりやすいので参照

absは絶対値を返すメソッド Integer#abs (Ruby 3.1 リファレンスマニュアル)

問題解くには条件を考えることを意識する必要がありそうです。

N = gets.chomp.to_i
a, b, c = [0, 0, 0]
N.times { 
  t, x, y = gets.chomp.split.map(&:to_i)

  #移動可能時刻と最短到着時刻を計算
  time = (a - t).abs
  position_total = (b - x).abs + (c - y).abs
  if (t + x + y) % 2 != 0 || time < position_total
    puts "No"
    exit
  end
  
  #今回入力された値を記録(これを入れないとAtCoderのテストがパスしない)
  a = t
  b = x
  c = y
}
puts "Yes"