骰子 (APCS 2020-07 中級)
1.0s 256M有 \(n\) 顆外觀相同的骰子,由左到右排成一列,位置編號為 \(1\) 到 \(n\)。
每顆骰子的初始方向都相同:
- 上面是 \(1\),下面是 \(6\);
- 前面是 \(4\),後面是 \(3\);
- 右面是 \(2\),左面是 \(5\)。
下圖以三顆骰子示意初始排列。每顆骰子顯示的上面是 \(1\)、前面是 \(4\)、右面是 \(2\);紅色圓點只用來強調上面與前面的移動,點數本身仍以圓點數量為準。
下圖是同一顆骰子的展開圖。中央紅色單點面是上面,與它相鄰的紅色四點面是前面;兩點面位於右側。由展開圖也可看出三組相對面分別是 \(1\) 與 \(6\)、\(4\) 與 \(3\)、\(2\) 與 \(5\)。
接下來會依序執行 \(m\) 次操作。每次操作給定兩個整數 \(a,b\):
-
若 \(b>0\),交換目前位於位置 \(a\) 與位置 \(b\) 的兩顆骰子。兩顆骰子的完整方向會一起交換。
-
若 \(b=-1\),把目前位於位置 \(a\) 的骰子向前滾一次。滾動後:
- 新上面是原本的後面;
- 新前面是原本的上面;
- 新下面是原本的前面;
- 新後面是原本的下面。
下圖左邊是初始方向,右邊是向前滾一次後的方向:原本的後面 \(3\) 來到上方,原本的上面 \(1\) 來到前方,而右面 \(2\) 不變。
-
若 \(b=-2\),把目前位於位置 \(a\) 的骰子向右滾一次。滾動後:
- 新上面是原本的左面;
- 新右面是原本的上面;
- 新下面是原本的右面;
- 新左面是原本的下面。
下圖左邊是初始方向,右邊是向右滾一次後的方向:原本的左面 \(5\) 來到上方,原本的上面 \(1\) 來到右方,而前面 \(4\) 不變。
「位置」是目前排列中的位置。例如交換位置 \(1\) 和 \(3\) 後,下一個作用在位置 \(1\) 的操作,會作用在剛剛從位置 \(3\) 換過來的那顆骰子。
請輸出所有操作完成後,各位置骰子的頂面點數。
輸入格式
第一行包含兩個正整數 \(n,m\),分別表示骰子數量與操作次數。
接下來 \(m\) 行,每行包含兩個整數 \(a,b\),表示一個操作。輸入保證:
- \(1\le a\le n\);
- \(b\) 是 \(-1\)、\(-2\),或滿足 \(1\le b\le n\) 的正整數。
限制
- \(1\le n\le20\)
- \(1\le m\le100\)
- 所有輸入都是整數。
輸出格式
輸出一行 \(n\) 個整數。第 \(i\) 個整數是所有操作完成後,位置 \(i\) 的骰子頂面點數。相鄰整數以一個空白分隔。
評分說明
兩筆範例會由評測系統執行,但不計分。另有恰好 \(20\) 個計分測試組,每組 \(5\) 分,所有測試組皆符合完整限制。
範例輸入 1
1 2
1 -2
1 -1
範例輸出 1
3
範例解釋 1
骰子先向右滾,方向變成上面 \(5\)、下面 \(2\)、前面 \(4\)、後面 \(3\)、右面 \(1\)、左面 \(6\)。接著向前滾,新上面是原本的後面,所以最後頂面是 \(3\)。
範例輸入 2
3 3
2 -1
3 -2
3 1
範例輸出 2
5 3 1
範例解釋 2
位置 \(2\) 的骰子向前滾後,頂面是 \(3\);位置 \(3\) 的骰子向右滾後,頂面是 \(5\)。最後交換位置 \(3\) 與位置 \(1\) 的兩顆骰子,因此三個位置的頂面依序為 \(5,3,1\)。
題目來源
APCS 2020 年 7 月實作題第 2 題;規則參考 ZeroJudge f580「骰子」 與王一哲的題解,題目敘述與附圖由 AACPOJ 重新整理、繪製。
登入後即可撰寫程式並提交評測。
登入