# APCS2020_07 骰子 ## Sol1. 想法: 骰子由於對面相加爲 7,因此我們只需儲存其中上、前、右方之數字即可。向右翻轉時,原本的左方(7 - 右方數字)變爲新的上方,而原來的上方變爲新的右方,向前翻轉以此類推。 也可用struct ```cpp= #include<bits/stdc++.h> using namespace std; int front[25], up[25], rightt[25], n ,m; void turn_f(int a){ int forn = front[a]; front[a] = up[a]; up[a] = 7 - forn; } void turn_r(int a){ int righ = rightt[a]; rightt[a] = up[a]; up[a] = 7 - righ; } void change(int a,int b){ swap(front[a], front[b]); swap(up[a], up[b]); swap(rightt[a], rightt[b]); } int main(){ ios::sync_with_stdio(0); cin.tie(0); cin >> n >> m; for(int i = 1;i <=n;i ++){ front[i] = 4; up[i] = 1; rightt[i] = 2; } for(int i = 0;i < m;i ++){ int a, b; cin >> a >> b; if (b == -1){ turn_f(a); }else if (b == -2){ turn_r(a); }else{ change(a,b); } } for(int i = 1;i <= n;i ++){ cout << up[i] << " "; } return 0; } ``` ## Sol2. 想法: 一樣存上、下、右 但就單純找規律 不討論骰子的性質 ```cpp= #include <iostream> using namespace std; int n, m, u[25], f[25], r[25], o[7] = {0, 6, 5, 4, 3, 2, 1}; int main() { cin >> n >> m; for (int i = 1; i <= n; i++){ u[i] = 1; f[i] = 4; r[i] = 2; } for (int i = 0, a, b; i < m; i++){ cin >> a >> b; if (b == -1){ f[a] = o[f[a]]; swap(u[a], f[a]); } else if (b == -2){ r[a] = o[r[a]]; swap(u[a], r[a]); } else{ swap(u[a], u[b]); swap(f[a], f[b]); swap(r[a], r[b]); } } for (int i = 1; i <= n; i++){ cout << u[i] << " "; } cout << endl; } ``` PS: 其實我覺得Sol1.比較好想 Sol2.考試我應該寫不出來w