---
# System prepended metadata

title: 實作題 - 骰子 - APCS - by Peter Wang
tags: [APCS]

---


# 實作題 - 骰子 - APCS - by Peter Wang
## 題目資訊
此題為2020.7測驗中的題目2
###### tags: `APCS` 

## 題目敘述
給定 n 個骰子排成一列，一開始都是點數 1 朝上，點數 4 朝前，點數 2 朝右 (如下左圖所示)，另外骰子的展開圖如下右圖所示。
![](https://i.imgur.com/9h1CnaW.png)
接下來有 m 次修改操作，每個操作包含兩個整數 a, b
若 a, b 都是正整數，交換編號 a 與編號 b 的骰子的位置。
若 b 為 −1，將編號 a 的骰子向前旋轉。
若 b 為 −2，將編號 a 的骰子向右旋轉。
在 m 次操作結束之後，依序輸出編號 1 到編號 n 的骰子朝上的點數。
### 輸入：
第一行包含兩個正整數 n,m(1≤n≤20,1≤m≤100)。

接下來 m 行每行有兩個整數，第 i 行的兩個正整數表示第 i 次操作。
### 輸出：
在一行輸出 n 個數字以空格分隔，第 i 個數字表示編號 i 的骰子最後朝上的點數。

## 解題思路
找出骰子的規律性作答。

## 程式碼
```clike=
#include<iostream>
#include<math.h>
using namespace std;
int main(){
  int n;
  while(cin>>n){
    int m;
    cin>>m;
    int arr[m][2];
    int d[n][3];
    for(int i=0;i<m;i++){
      cin>>arr[i][0];
      cin>>arr[i][1];
    }
    for(int i=0;i<n;i++){
      d[i][0]=1;
      d[i][1]=4;
      d[i][2]=2;
    }
    int mm=0,nn=0,oo=0;
    for(int i=0;i<m;i++){
      if(arr[i][0]>0 && arr[i][1]>0){
        mm=d[arr[i][0]-1][0];
        nn=d[arr[i][0]-1][1];
        oo=d[arr[i][0]-1][2];
        d[arr[i][0]-1][0]=d[arr[i][1]-1][0];
        d[arr[i][0]-1][1]=d[arr[i][1]-1][1];
        d[arr[i][0]-1][2]=d[arr[i][1]-1][2];
        d[arr[i][1]-1][0]=mm;
        d[arr[i][1]-1][1]=nn;
        d[arr[i][1]-1][2]=oo;
      }
      else{
        if(arr[i][1]==-1){
          int pp=d[arr[i][0]-1][1];
          d[arr[i][0]-1][1]=d[arr[i][0]-1][0];
          d[arr[i][0]-1][0]=7-pp;
        }
        else{
          int pp=d[arr[i][0]-1][2];
          d[arr[i][0]-1][2]=d[arr[i][0]-1][0];
          d[arr[i][0]-1][0]=7-pp;
        }
      }
    }
    for(int i=0;i<n;i++){
      cout<<d[i][0]<<" ";
    }
    cout<<endl;
  }
}
```
## 資料來源
[zerojudge](https://zerojudge.tw/)
[題目敘述](https://zerojudge.tw/ShowProblem?problemid=f580)

## 備註
>[name=PeterWang]
>[time=Sat, Jun 19, 2021 1:48 PM]