こんにちは! mnbd(@mnbbbbbd)です。
AIZU ONLINE JUDGEの「ITP1_11_A サイコロ I」を解いてみましたので、その回答と解説をご紹介いたします。
プログラミング初心者なので、もっといい回答があるに違いありません。
あくまでも「動作はする」サンプルとしてご覧ください。
問題文
次の展開図から得られるサイコロを転がすシミュレーションを行うプログラムを作成してください。
サイコロの各面には図のとおりに 1 から 6 のラベルが割りあてられています。
入力としてサイコロの各面のラベルに対応する整数と、転がす命令の列が与えられるので、サイコロの上面の整数を出力してください。シミュレーションの初期状態は、図のとおりのラベルの位置でサイコロが置かれているものとします。
Input
1行目に各面の整数が、図に示すラベルの順番に空白区切りで与えられます。
2行目に命令を表す1つの文字列が与えられます。命令はそれぞれ図に示す4方向を表す文字 E、N、S、W を含む文字列です。
Output
すべての命令を実行した後のサイコロの上面の数を1行に出力してください。
Note
続くシリーズ Dice III, Dice IV では、複数のサイコロを扱うので、サイコロをクラスや構造体で作成しておきましょう。
https://onlinejudge.u-aizu.ac.jp/courses/lesson/2/ITP1/11/ITP1_11_A
解答
#include <bits/stdc++.h>
using namespace std;
struct dice {
int number[6];
};
int main() {
dice d;
for(int i = 0; i < 6; i++) {
cin >> d.number[i];
}
string instruction;
cin >> instruction;
for(int i = 0; i < instruction.size(); i++) {
int tmp;
if(instruction[i] == 'S') {
// S
tmp = d.number[0];
d.number[0] = d.number[4];
d.number[4] = d.number[5];
d.number[5] = d.number[1];
d.number[1] = tmp;
} else if(instruction[i] == 'E') {
// E
tmp = d.number[0];
d.number[0] = d.number[3];
d.number[3] = d.number[5];
d.number[5] = d.number[2];
d.number[2] = tmp;
} else if(instruction[i] == 'N') {
// N
tmp = d.number[0];
d.number[0] = d.number[1];
d.number[1] = d.number[5];
d.number[5] = d.number[4];
d.number[4] = tmp;
} else if(instruction[i] == 'W') {
// W
tmp = d.number[0];
d.number[0] = d.number[2];
d.number[2] = d.number[5];
d.number[5] = d.number[3];
d.number[3] = tmp;
}
}
cout << d.number[0] << endl;
return 0;
}
解説
サイコロの値を構造体で保持しています。
このようなデータ構造が適切かどうかはわかりません。
サイコロが転がった時に、それぞれの面の値を代入し直しています。
あとは最終的に上に来る値を出力しています。
ハマったポイント
動くコードは書けましたが、4方向分の値をそれぞれ代入する箇所は似通っています。
ここはもっといい書き方がないものかと考えましたが思い浮かびませんでした。
まとめ
AIZU ONLINE JUDGEの「ITP1_11_A サイコロ I」を解いてみましたので、その回答と解説をご紹介いたしました。
少しずつですが、プログラミングの勉強をしています。
まだ初心者ですが、よかったらつながっていただけると嬉しいです。
Twitterアカウント(@mnbbbbbd)
以上です。
読んでいただきありがとうございました!