考えて競プロする

プログラミングコンテストの問題をどう考えて解いたかを記録していくブログです。使用言語はPython3

ABC108-B - Ruined Square を解く

ABC108-B - Ruined Square

 

正方形の座標を反時計回りに

(x1, y1), (x2, y2), (x3, y3), (x4, y4) とする

(x1, y1), (x2, y2) のみが与えられるので、そこから (x3, y3), (x4, y4) を求める問題

 

いまいちイメージしづらいのでサンプルを見て考えていくことにする

2つ目のサンプルに注目してみる

 

入力例2

2 3 6 6

 

出力例2

3 10 -1 7

 

(x1, y1) = (2, 3),  (x2, y2) = (6, 6) のとき

(x3, y3) = (3, 10),  (x4, y4) = (-1, 7) となるらしい

 

それぞれの頂点間でx軸方向の増加量、y軸方向の増加量は

どうなっているかに注目してみる

 

まずは (x1, y1) → (x2, y2) について

x軸方向の増加量は +4(6 - 2 = 4)

y軸方向の増加量は +3(6 - 3 = 3)

 

次に (x2, y2) → (x3, y3) について

x軸方向の増加量は -3(3 - 6 = -3)

y軸方向の増加量は +4(10 - 6 = 4)

 

(x3, y3) → (x4, y4) について

x軸方向の増加量は -4(-1 - 3 = -4)

y軸方向の増加量は -3(7 - 10 = -3)

 

最後に (x4, y4) → (x1, y1) について

x軸方向の増加量は +3(2 - ( -1 ) = 3)

y軸方向の増加量は -4(3 - 7 = -4)

 

上記の通り、出現する増加量は(符号は異なるが)2種類しか存在しない

つまり、(x3, y3), (x4, y4) は初めに与えられた2点から得られる

x軸方向の増加量とy軸方向の増加量を足し引きしていくことで求められる

 

以上を踏まえて書いたコードを以下に示す

 

提出したコード

# 入力
x1,y1,x2,y2=map(int,input().split())

x3=x2-(y2-y1)
y3=y2+(x2-x1)
x4=x3-(y3-y2)
y4=y3+(x3-x2)

# 出力
print(x3,y3,x4,y4)

 

正直サンプルに合わせるようにごちゃごちゃ何度も試しながら書いたので

コードの意味はあまり理解できていない…

参考にならなかったら申し訳ないです

 

提出結果はACでした