前往
大廳
主題

ZeroJudge - f646: 小球碰撞 解題心得

Not In My Back Yard | 2021-03-11 21:26:51 | 巴幣 0 | 人氣 194

題目連結:


題目大意:
輸入有多列,每列給定三正整數 T 、 H 、 W (1 ≦ T 、 H 、 W ≦ 1,000,000,000),代表有一個 H 列 × W 行的網格,有一個體積為 0 (即為一個點)的小球從網格左上角(起點座標 (0, 0),而網格往右為 +X 方向、往下為 +Y 方向)並往右下 45° 角度出發。

已知小球每單位時間可以走完一個網格的對角線之距離(在此設為此距離為一單位距離),而且小球一旦碰到網格邊緣時會反彈。試問 T 單位時間後,小球的 X 、 Y 座標為何(單位為前面定義的單位距離)?答案請四捨五入至小數點後第一位。

小球運動軌跡之模式如下列三張圖所示:



範例輸入:
6 3 10
10 3 10
3 1 2
4 1 2


範例輸出:
x=4.2 y=0.0
x=7.1 y=1.4
x=0.7 y=0.7
x=0.0 y=0.0


解題思維:
先來看看小球走一單位距離, X 方向以及 Y 方向會走多少。因為小球是沿著網格的對角線移動,而且每單位時間走一條對角線再加上網格本身的形狀為正方形。所以小球每走一單位距離, X 方向以及 Y 方向便移動了 (√2) ÷ 2 單位距離(根據畢氏定理),而這也是網格本身的邊長。

為了方便起見,我們將小球的移動方向分切為 X 方向以及 Y 方向(即向量之概念)並將 X 方向的一步((√2) ÷ 2 單位距離,也就是網格的邊長)定為 I 、 Y 方向的一步(網格邊長)定為 J 。



先考慮 X 方向:
每單位時間,小球會移動 I 單位距離。而自開始的 W 單位時間後便會抵達網格的最右側(此時走了 W × I 單位距離),反彈後便往左側返回;同樣地,再次經過 W 單位後,小球就會抵達網格的最左側。

所以我們可以看到每 2W 單位時間會形成一個循環,前 W 單位時間會從左側跑到右側、後 W 單位時間會從右側跑到左側。

因此,我們可以先計算 T 單位時間會經過多少個循環。不足構成一個循環而所剩下的時間 T'(0 ≦ T' < 2W) ,再判斷其有沒有 > W,以判斷其為前半的 W 單位時間還是後半的單位時間。

如果為前半的 W 單位時間,則小球在 X 方向最後停留的位置即為 T' × I 單位距離;若為後半,則為 (2W - T') × I 單位距離。



類似地, Y 方向也可以套用 X 方向的論證得出小球於 Y 方向停留的位置為 T' × J (前半的 H 單位時間)或是 (2H - T') × J (後半的 H 單位時間)。



最後,因為 I 以及 J 皆為 (√2) ÷ 2 單位距離,所以將上面的 I 、 J 替換成該值即可得出所求。




此次分享到此為止,如有任何更加簡潔的想法或是有說明不清楚之地方,也煩請各位大大撥冗討論。

創作回應

更多創作