主題

ZeroJudge - f633: 魔術方塊 2X2 解題心得

Not In My Back Yard | 2021-02-02 00:00:01 | 巴幣 0 | 人氣 49

題目連結:


題目大意:
給定一個 2 × 2 魔方的展開圖並指定魔方的特定面為正面、背面、上面、底面、左面以及右面,如下:
一開始正面的數字都標記為 1 ,同理右面、上面、底面、左面和背面也被依序標為 2 、 3 、 4 、 5 、 6。

現在定義指令 CMD,CMD 只會有以下四種值:
CMD = 1 ,順時針旋轉右面;
CMD = 2 ,順時針旋轉上面;
CMD = 3 ,順時針旋轉左面;
CMD = 4 ,順時針旋轉底面。
至於順時針的基準點可以參考上面的展開圖。因此當展開圖重組回一個魔方(保持正面面朝己的組法)時,可以看到
CMD = 1 會使得正面的右半側向上轉動;
CMD = 2 會使得正面的上半側向左轉動;
CMD = 3 會使得正面的左半側向下轉動;
CMD = 4 會使得正面的下半側向右轉動。

現在輸入有若干列(≦ 1000 列),每列給定一個 CMD 之值。試問全部的旋轉指令執行完後的魔方,其正面四個數字分別為多少?



範例輸入:
範例輸入 #1
1
2
3
4

範例輸入 #2
4
3
2
1

範例輸入 #3
1
1
1
1
2
2
2
2
3
3
3
3
4
4
4
4


範例輸出:
範例輸出 #1
3 2
5 4

範例輸出 #2
2 4
3 4

範例輸出 #3
1 1
1 1


解題思維:
對於空間感較不好、腦部快取記憶體不夠記不起來(像是我)或是覺得畫下來很麻煩(像是我)等等且手邊沒有 2 × 2 魔術方塊的人,可以使用這個網站把玩看看 2 × 2 魔術方塊。



本題就單純只是模擬即可。

我的模擬法是根據展開圖中,將上底左右正背六面命名為 Top 、 Bottom 、 Left 、 Right 、 Front 、 Back 。

並對於每一面的數字按照特定順序標記,以 Top 來說:Top[0] 代表左上的數字、Top[1] 代表右上、Top[2] 代表左下數字 、 Top[3] 則代表右下。其他面同理。

因此,對於每一面自身的順時針旋轉就只是將原本的位置 0 的數字移到位置 1 、 位置 1 移到位置 2 、位置 2 移到位置 3 、位置 3 移到位置 0。

而上面以及底面的旋轉造成的正面、背面、左面以及右面的數字位移也相當地直觀,例如正面左上的數字會跑到左面的左上、左面的左上會跑到背面的左上等等,而這些位置之編號剛好都相同。

至於左面與右面的旋轉就沒有很直觀了,因為此時背面的數字編號的對應移動到其他面會怪怪的,需要特判。




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

創作回應

更多創作