题目描述
骰子是一个立方体,每个面一个数字,初始为左1,右2,前3(观察者方向),后4,上5,下6,用123456表示这个状态,放置在平面上。
可以向左翻转(用L表示向左翻转1次),可以向右翻转(用R表示向右翻转1次),可以向前翻转(用F表示向前翻转1次),可以向后翻转(用B表示向后翻转1次),可以逆时针旋转(用A表示逆时针旋转90度),可以顺时针旋转(用C表示顺时针旋转90度)。
现从123456这个初始状态开始,根据输入的动作序列,计算得到最终的状态。
输入描述
输入一行,为只包含LRFBAC的字母序列,最大长度为50,字母可重复。
输出描述
输出最终状态。
用例输入
L R
123456
F C R
342156
解题思路
可以通过定义一个 data 数组来表示骰子的六个面的数字。初始状态下,data[1] = 1,data[2] = 2,data[3] = 3,data[4] = 4,data[5] = 5,data[6] = 6。
每个操作对应着骰子一个面的数字变化。我们可以通过在 change 函数中根据操作符 L、R、F、B、A 和 C 来修改数组的内容。具体操作如下:
L: 向左翻转,改变左、右、前、后、上、下之间的关系。
R: 向右翻转,改变左、右、前、后、上、下之间的关系。
F: 向前翻转,改变前、后、上、下之间的关系。
B: 向后翻转,改变前、后、上、下之间的关系。
A: 逆时针旋转90度,改变左、前、右、后之间的关系。
C: 顺时针旋转90度,改变左、前、右、后之间的关系。
通过顺序处理输入的每个动作,我们最终可以得到骰子的最终状态。
代码
#include <iostream>
#include <vector>
#include <queue>
#include <sstream>
#include <string>
using namespace std;
void change(char c,vector<int>& data) {
if (c == 'L') {
int cur = data[1];
data[1] = data[5];
data[5] = data[2];
data[2] = data[6];
data[6] = cur;
}
else if (c == 'R') {
int cur = data[1];
data[1] = data[6];
data[6] = data[2];
data[2] = data[5];
data[5] = cur;
}
else if (c == 'F') {
int cur = data[3];
data[3] = data[5];
data[5] = data[4];
data[4] = data[6];
data[6] = cur;
}
else if (c == 'B') {
int cur = data[3];
data[3] = data[6];
data[6] = data[4];
data[4] = data[5];
data[5] = cur;
}
else if (c == 'A') {
int cur = data[3];
data[3] = data[1];
data[1]= data[4];
data[4] = data[2];
data[2] = cur;
}
else if (c == 'C') {
int cur = data[3];
data[3] = data[2];
data[2] = data[4];
data[4] = data[1];
data[1] = cur;
}
}
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
string line;
getline(cin, line);
stringstream ss(line);
vector<int> data = {0,1,2,3,4,5,6 };
char c;
while (ss >> c) {
change(c, data);
}
for (int i = 1; i <= 6; i++) {
cout << data[i];
}
cout << "\n";
return 0;
}