# Array Manipulation# Simulation# Problem Solving

e516 - 10409 - Die Game

🔗 前往 ZeroJudge 原題

題目描述

題目描述了一個骰子的滾動模擬遊戲。初始時,骰子的頂面是 1,北面是 2,西面是 3。給定一系列滾動指令(東、南、西、北),要求模擬骰子的滾動,並輸出最終頂面上的數字。

解題思路

這題的核心在於理解骰子的滾動規則,以及如何根據指令更新骰子的各個面。由於骰子的相對面數字和為 7,因此可以通過預先定義好各個面的初始值,然後根據指令進行面的旋轉來模擬滾動。程式碼中 ans 陣列儲存了骰子的各個面,ans[0] 代表頂面,ans[1] 代表上,ans[2] 代表左,ans[3] 代表下,ans[4] 代表右,ans[5] 代表後。根據指令,將 ans 陣列中的元素進行相應的交換,模擬骰子的滾動。

複雜度分析

  • 時間複雜度: O(n),其中 n 是指令序列的長度。因為程式碼需要遍歷指令序列一次。
  • 空間複雜度: O(1),因為程式碼只使用了固定大小的 ans 陣列來儲存骰子的各個面。

程式碼

#include <iostream>
using namespace std;
string a;
int main(){
	int t;
	while(cin >> t){
		if(t==0)break;
		int ans[6]={1,2,3,5,4,6};//正 上 左 下 右 後 
		while(t--){
			cin >> a;
			if(a[0]=='s'){
				int tmp=ans[0];
				ans[0]=ans[1];
				ans[1]=ans[5];
				ans[5]=ans[3];
				ans[3]=tmp;
			}	
			else if(a[0]=='e'){
				int tmp=ans[0];
				ans[0]=ans[2];
				ans[2]=ans[5];
				ans[5]=ans[4];
				ans[4]=tmp;
			}
			else if(a[0]=='n'){
				int tmp=ans[0];
				ans[0]=ans[3];
				ans[3]=ans[5];
				ans[5]=ans[1];
				ans[1]=tmp;
			}
			else{
				int tmp=ans[0];
				ans[0]=ans[4];
				ans[4]=ans[5];
				ans[5]=ans[2];
				ans[2]=tmp;
			}
		}
		cout << ans[0] << "\n";
	}
}

Discussion