寝癖頭の解法

学習中の覚え書きを投稿、更新していきます。

Aizu Online Judge in C++ #ITP1_11_C : Dice III

Aizu Online Judge(AOJ)の過去問から、その提出コードの解答例です。

・問題 "Dice III"
https://onlinejudge.u-aizu.ac.jp/problems/ITP1_11_C
・サイコロ III

僕が作成、提出したコードは、以下のとおりです。

Aizu Online Judge in C++ #ITP1_11_C : Dice III
/*
Aizu Online Judge in C++ #ITP1_11_C : Dice III
https://onlinejudge.u-aizu.ac.jp/problems/ITP1_11_C
 提出コードの解答例
 https://neguse-atama.hatenablog.com
*/
#include<bits/stdc++.h>
using namespace std;
struct Dice{
    int s[6];
    void roll(char c){
        int i;
        if(c=='E'){
            i=s[0];
            s[0]=s[3];
            s[3]=s[5];
            s[5]=s[2];
            s[2]=i;
        }else if(c=='W'){
            i=s[0];
            s[0]=s[2];
            s[2]=s[5];
            s[5]=s[3];
            s[3]=i;
        }else if(c=='N'){
            i=s[0];
            s[0]=s[1];
            s[1]=s[5];
            s[5]=s[4];
            s[4]=i;
        }else if(c=='S'){
            i=s[0];
            s[0]=s[4];
            s[4]=s[5];
            s[5]=s[1];
            s[1]=i;
        }else{
            i=s[1];
            s[1]=s[2];
            s[2]=s[4];
            s[4]=s[3];
            s[3]=i;
        }
    }
    int up(void){
        return s[0];
    }
    int left(void){
        return s[3];
    }
    int right(void){
        return s[2];
    }
    int front(void){
        return s[1];
    }
};
bool same(Dice a,Dice b){
    for(int i=0;i<6;i++){
        if(a.s[i]!=b.s[i]){
            return false;
        }
    }
    return true;
}
int main(void){
    Dice d[2];
    for(int j=0;j<2;j++){
        for(int i=0;i<6;i++){
            cin>>d[j].s[i];
        }
    }
    bool tf=false;
    for(int i=0;i<4;i++){
        d[1].roll('R');
        for(int j=0;j<4;j++){
            d[1].roll('N');
            if(same(d[0],d[1])){
                tf=true;
            }
        }
    }
    d[1].roll('E');
    for(int j=0;j<4;j++){
        d[1].roll('N');
        if(same(d[0],d[1])){
            tf=true;
        }
    }
    d[1].roll('W');
    d[1].roll('W');
    for(int j=0;j<4;j++){
        d[1].roll('N');
        if(same(d[0],d[1])){
            tf=true;
        }
    }
    cout<<(tf ? "Yes" : "No")<<endl;
    return 0;
}

設問の出典は、プログラミング問題のオンライン採点システム「Aizu Online Judge(AOJ)」です。
http://judge.u-aizu.ac.jp/onlinejudge/