切換
舊版
前往
大廳
主題

ZeroJudge - f012: 奶油機器人 解題心得

Not In My Back Yard | 2020-08-25 00:01:07 | 巴幣 0 | 人氣 221

題目連結:


題目大意:
現在有一機器人在一個全白的平面上的原點(0, 0)格子並面向上方(+y 方向)。每當機器人在白色格子上,該格會變成黑色,而機器人會先向右轉 90° 然後往前走一格;如果機器人在黑色格子上,該格會變白,而機器人會向左轉 90° 然走一格。

輸入有多列,每列給定一正整數 n (1 ≦ n ≦ 2 ^ 48),試問機器人走 n 步之後抵達的格子之座標為何?



範例輸入:
1
2
3
5
10
100
1000
2147483647
2147483648
2200000000


範例輸出:
(1,0)
(1,-1)
(0,-1)
(-1,0)
(-1,-1)
(0,2)
(8,6)
(-41297588,-41297561)
(-41297588,-41297562)
(-42307516,-42307490)


解題思維:
如果只是單純地模擬並輸出機器人的座標,可能看不出什麼所以然。但是如果我們以圖象將格子座標視覺化,如下圖:
畫面的左中有個小紅色箭頭,代表機器人的位置以及面向的方向。上面有個「Now Steps:10494」,代表機器人從一開始到這個畫面為止走了 10494 步(至於左邊的數字只是調整機器人的執行速度)。

可以看到畫面左方中間有個往左下伸出的結構,如果版面再開大一點並讓它繼續的話,是真的會一直往左下走的。因為從大約 10200 步左右,開始會有重複、循環出現的模式(格子和機器人的方向),使得機器人會陷入一個無窮無盡的循環(每個循環為 104 步)之中。

事實上,這個機器人在數學上被稱為「蘭頓螞蟻」(Langton's Ant,見維基頁面之介紹),因為提出者是克里斯多夫.蘭頓(Christopher Langton)且是以螞蟻來充當這題機器人所扮演的角色。



由上我們可以看到,將前 10500 步機器人的位置窮舉出來,剩下跑一次 104 步的循環並記錄每一步的位移、以及 104 的總位移(位移有 x 、 y 座標的分量,要各自儲存)。

接著對於每個給定的步數 n 值,判斷是否 ≦ 10500 (即窮舉出來的步數)。如果是,就輸出對應的窮舉出的該步之位置;如果不是就是第 10500 步的位置加上剩下 (n - 10500) ÷ 104 取商數(代表經歷幾個循環) × 一個循環的總位移,最後再加上 (n - 10500) ÷ 104 的餘數(代表最末尾的循環)的剩餘位移量,即是所求。




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

創作回應

相關創作

更多創作