$\newcommand{\O}{\mathrm{O}}$ My Algorithm : kopricky アルゴリズムライブラリ

kopricky アルゴリズムライブラリ

Dice

コードについての説明

サイコロ問題のために Rotate と回転後の上の面を返すようなコードを書いた.
間違ってはいないがあまり良い実装だと思っていないのでおすすめはしない

コード

//上:0,下:1,右:2,左:3,手前:4,奥:5
struct Dice{
    vector<int> f={1,6,5,2,3,4};
    //回転後に上になる面を返す
    int Rotate(int dir,bool plus){
        //(+X,+Y,Z(上から見て左回り) 方向へrotate, plus=falseなら-方向)
        if(plus){
            if(dir == 0){
                swap(f[0],f[2]),swap(f[0],f[1]),swap(f[0],f[3]);
            }else if(dir == 1){
                swap(f[0],f[5]),swap(f[0],f[1]),swap(f[0],f[4]);
            }else{
                swap(f[2],f[5]),swap(f[2],f[3]),swap(f[2],f[4]);
            }
        }else{
            if(dir == 0){
                swap(f[0],f[3]),swap(f[0],f[1]),swap(f[0],f[2]);
            }else if(dir == 1){
                swap(f[0],f[4]),swap(f[0],f[1]),swap(f[0],f[5]);
            }else{
                swap(f[2],f[4]),swap(f[2],f[3]),swap(f[2],f[5]);
            }
        }
        return f[0];
    }
    //face[id1]=num1,face[id2]=num2になるむきにサイコロを回転させる
    //2面でサイコロの向きは決定するので
    void Arrange(int id1, int num1, int id2, int num2){
        while(1){
            if(f[id1] == num1 && f[id2] == num2){
                return;
            }
            Rotate(rand()%3,true);
        }
    }
};

verify 用の問題

AOJ : Biased Dice 提出コード