Intel Code Challenge Final Round C.Ray Tracing

C.Ray Tracing


題意:在n*m的空間內,一個小球從(0,0)以固定的速度2 ,並且以斜45°的角度出發.若碰到空間邊界則反彈.若碰到空間四個角落的點則停止.給你k個點,問到達該點所需時間,若到達不了,則輸出-1.


思路:
1. 按照給出的樣例模擬走幾遍,可以發現結束的時間爲lcm(n,m) .
2. 希望將這些折線放在y=x 這條直線上,就可以方便計算某點時間.那麼就可以考慮怎麼樣找出該點在y=x 上的點.

  • 任意點(x,y) ,設在直線y=x 上的點爲(x,y) .
  • xxmod(2n) ,yymod(2m)
  • 即轉化成線性方程組2nX+2mY=yx
  • 用擴展gcd求解
  • 假設點(x,y) 是第一次反彈後那條折線上的點,那麼它在y=x 上的點爲(2nx,y)(x,2my) .
  • 若是兩次反彈後那條折線上的點,那麼它在y=x 上的點爲(2nx,2my) .
  • 若點(x,y) 中x=y,那麼它就在直線y=x 上.
  • 不確定該點是幾次彈射後,就對這四個點都進行一次方程求解,取最小值.

This Code

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章