机试题——转骰子

题目描述

骰子是一个立方体,每个面一个数字,初始为左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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值