回到 CPE 必考一顆星 49 題選集

UVa 10409 - Die Game

( Tip: 點擊左上方的三橫槓選單按鈕,可以收起左側 Pdf 頁。)

Step 1. 題目概要

  • 桌上有一顆骰子,並在一開始保持初始狀態:頂面為1點,北面為2點,西面為3點。
  • 解出另外三個面的規則為:任何一對相對的面的數字總和始終為7。
  • 您的程式應接受一系列指令,指令為東"east",南"south",西"west",北"north"。
    • 例如"north"指令將骰子向下滾動到北,即頂面變為新的北,北變為新的底,依此類推。
  • 執行完所有指令後,程式應顯示最終位於頂面的數字。

Step 2. 解題思路

  • 根據規則,我們可以看出初始的各面對應點數分別為:上1,下6,北2,南5,西3,東4
  • 模擬滾動的結果後,我們可以看出規律:
    • 向北轉,東西面不會動到;只要把底、北、頂、南面兩兩交換一輪即可
    • 向南轉,東西面不會動到;只要把底、南、頂、北面兩兩交換一輪即可
    • 向西轉,南北面不會動到;只要把底、西、頂、東面兩兩交換一輪即可
    • 向東轉,南北面不會動到;只要把底、東、頂、西面兩兩交換一輪即可

Step 3. 範例輸入與輸出 - Sample Input and Output

Step 4. 參考程式碼 - Accepted Code

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
#include <bits/stdc++.h>
using namespace std;

int main() {
ios::sync_with_stdio(0);
cin.tie(0);

int n;
string cmd;
while(cin>>n) {
//起始面:上1,下6,北2,南5,西3,東4
int top=1,bottom=6;
int north=2,south=5;
int west=3,east=4;
if(n==0) break;
for(int i=0;i<n;i++) {
cin>>cmd;
if(cmd=="north") { //向北轉,東西面不會動到
swap(bottom,north);
swap(north,top);
swap(top,south);
} else if(cmd=="south") { //向南轉,東西面不會動到
swap(bottom,south);
swap(south,top);
swap(top,north);
} else if(cmd=="west") { //向西轉,南北面不會動到
swap(bottom,west);
swap(west,top);
swap(top,east);
} else if(cmd=="east") { //向東轉,南北面不會動到
swap(bottom,east);
swap(east,top);
swap(top,west);
}
}
//output
cout<<top<<"\n";
}
return 0;
}
回到 CPE 必考一顆星 49 題選集