# Array Manipulation# Simulation# Data Structure

f580 - 2. 骰子

🔗 前往 ZeroJudge 原題

題目描述

題目給定 n 個骰子,初始狀態每個骰子的 1 點朝上。接著進行 m 次操作,操作包含交換骰子位置、將骰子向前旋轉、將骰子向右旋轉。最終輸出每個骰子 1 點朝上的點數。

解題思路

這題主要使用陣列來模擬骰子的狀態和操作。首先,建立一個 die 結構體,包含一個大小為 6 的陣列 w,代表骰子的六個面。初始時,將每個骰子的 w 陣列設定為 [0, 1, 2, 3, 4, 5],代表 1 到 6 點。

然後,根據輸入的 m 次操作,進行相應的處理:

  1. 如果操作是交換骰子位置,則交換兩個骰子的 die 結構體。
  2. 如果操作是向前旋轉,則將骰子的 w 陣列進行旋轉,例如 [0, 1, 2, 3, 4, 5] 旋轉後變成 [4, 0, 2, 3, 5, 1]
  3. 如果操作是向右旋轉,則將骰子的 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 << " ";
}

Discussion