f580 - 2. 骰子
題目描述
題目給定 n 個骰子,初始狀態每個骰子的 1 點朝上。接著進行 m 次操作,操作包含交換骰子位置、將骰子向前旋轉、將骰子向右旋轉。最終輸出每個骰子 1 點朝上的點數。
解題思路
這題主要使用陣列來模擬骰子的狀態和操作。首先,建立一個 die 結構體,包含一個大小為 6 的陣列 w,代表骰子的六個面。初始時,將每個骰子的 w 陣列設定為 [0, 1, 2, 3, 4, 5],代表 1 到 6 點。
然後,根據輸入的 m 次操作,進行相應的處理:
- 如果操作是交換骰子位置,則交換兩個骰子的
die結構體。 - 如果操作是向前旋轉,則將骰子的
w陣列進行旋轉,例如[0, 1, 2, 3, 4, 5]旋轉後變成[4, 0, 2, 3, 5, 1]。 - 如果操作是向右旋轉,則將骰子的
w陣列進行旋轉,例如[0, 1, 2, 3, 4, 5]旋轉後變成[2, 1, 5, 0, 4, 3]。
最後,遍歷所有骰子,輸出每個骰子的 w[0] 加 1,因為 w 陣列中的值是 0 到 5,代表 1 到 6 點。
複雜度分析
- 時間複雜度: O(m * n)
- 空間複雜度: O(n)
程式碼
#include <iostream>
using namespace std;
struct die{
int w[6];
};
int n,m,x,y;
int main(){
cin.tie(0); ios::sync_with_stdio(false);
cin >> n >> m;
die a[n];
for(int i=0;i<n;++i)
for(int j=0;j<6;++j)
a[i].w[j]=j;
while(m--){
cin >> x >> y;
if(x>0&&y>0)
swap(a[x-1],a[y-1]);
else{
if(y==-2){
int b[6]={a[x-1].w[4],a[x-1].w[0],a[x-1].w[2],a[x-1].w[3],a[x-1].w[5],a[x-1].w[1]};
for(int j=0;j<6;++j)
a[x-1].w[j]=b[j];
}
else if(y==-1){
int b[6]={a[x-1].w[2],a[x-1].w[1],a[x-1].w[5],a[x-1].w[0],a[x-1].w[4],a[x-1].w[3]};
for(int j=0;j<6;++j)
a[x-1].w[j]=b[j];
}
}
}
for(int i=0;i<n;++i)
cout << a[i].w[0]+1 << " ";
}