AtCoder ABC 183 B – Billiards Python解説

スポンサーリンク

Billiards

高橋君は 2 次元平面上でビリヤードをしています。x 軸は壁になっており、球をぶつけると入射角と反射角が等しくなるように球が跳ね返されます。
いま高橋君の球が (Sx​,Sy​) にあります。ある座標を狙って球を撞くと、球はその座標へ向かって直線的に転がっていきます。
x 軸で球をちょうど 1 回反射させたのち、(Gx​,Gy​) を通過させるためには、x 軸のどこを狙えば良いでしょうか?

AtCoder Beginner Contest 「Billiards」

問題文より、入射角と反射角が等しいので、あとは高橋君の球と目標の座標からx軸に向かって線を引けば、三角形の相似条件「2組の角がそれぞれ等しい」を使えるはず。(違ったらすいません)

sx, sy, gx, gy = map(int, input().split())

x = (gx - sx) * sy / (sy + gy) + sx

print(x)

相似関係なら、y軸の比率がそのままx軸の比率になるので、sy / (sy + gy)でy軸の比率を求めています。x軸の比率を求めたら+sxをして比率から実際の座標を出力して完了です。