サイコロを転がす問題

Aize On Judgeの問題解きは結構続いています。もう少しでIntroduction To Programming Iが完了しそうです。今回はサイコロの問題。今まではサイコロを決まったとおりに転がしたときの目のを求める問題で迷いました。

問題は下記のリンクにあります。
Aizu Online Judge Dice I

サイコロの6面にそれぞれ数字が割り当てられて、N,S,W,E(東西南北)にサイコロを回転させたときに上に来る数値を回答するような内容です。しかも今後のためにクラスや構造体で作成しておくとのこと。

実際にサイコロを作成して、N,S,W,Eへそれぞれ回転させたときに、どこに移動するか確認し、配列を受け渡すプログラムを作成しました。

こんな感じで、S,W,Eの場合も考えると。

コードは以下のようになりました。

#include <iostream>
#include <string>
#include <array>
using namespace std;

struct Dice
{
    array<int, 6> roll;
    void toNorth()
    {
        array<int, 6> t = roll;
        roll[4] = t[0];
        roll[0] = t[1];
        roll[5] = t[4];
        roll[1] = t[5];
    }
    void toSouth()
    {
        array<int, 6> t = roll;
        roll[1] = t[0];
        roll[5] = t[1];
        roll[0] = t[4];
        roll[4] = t[5];
    }
    void toWest()
    {
        array<int, 6> t = roll;
        roll[3] = t[0];
        roll[0] = t[2];
        roll[5] = t[3];
        roll[2] = t[5];
    }
    void toEast()
    {
        array<int, 6> t = roll;
        roll[2] = t[0];
        roll[5] = t[2];
        roll[0] = t[3];
        roll[3] = t[5];
    }
};

int main()
{
    int num;
    string commands;
    Dice dice;
    for (int i=0; i<6; i++) {
        cin >> dice.roll[i];
    }
    cin >> commands;
    size_t size = commands.size();
    for (size_t i=0; i<=size; i++ ) {
        if (commands[i]=='N')
            dice.toNorth();
        else if (commands[i]=='S')
            dice.toSouth();
        else if (commands[i]=='E')
            dice.toEast();
        else if (commands[i]=='W')
            dice.toWest();
    }
    cout << dice.roll[0] << endl;
    
    return 0;
}

http://judge.u-aizu.ac.jp/onlinejudge/review.jsp?rid=3407308#1

コメントする

メールアドレスが公開されることはありません。 が付いている欄は必須項目です