欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

二阶魔方旋转

程序员文章站 2022-07-07 15:14:52
...

题目

转动魔方
题目描述
二阶魔方有6个不同颜色的面,分别是红(Red),橙(Orange),黄(Yellow),白(White),蓝(Blue)和绿色(Green),
每个面都有 4个小正方块拼成
初始状态:魔方已经还原,并且W色朝下,Y色向上,R色在前,O色在后,B色左边,G色右边。
二阶魔方旋转

定义三种旋转操作:
二阶魔方旋转

二阶魔方旋转

输入说明
以命令行参数的形式,输入任意的旋转操作字符串序列, 如 XYZZX

int main(int argc, char* argv[])
{
char* input = argv[1];

return 0;
}

输出说明
在初始状态下,经过输入序列的操作后,依次输出正面的4个小方块的颜色

示例1
输入:
XZY

输出:
GORW

示例2
输入:
XY

输出:
GGRW

思路

  1. 这是一道完全模拟的题目,把数据结构和操作定义出来就行了。
  2. 先定义了24个char型代表其24个小面,从 1 到 24,每4个组成一个大面:
    二阶魔方旋转
  3. 根据定义,写旋转操作。

代码

#include <iostream>
#include <fstream>
#include <functional>
#include <algorithm>
#include <string.h>
#include <list>
#include <vector>
using namespace std;

void getResult();
void init();
void reX();
void reY();
void reZ();
void reZheng(char &c1, char &c2, char &c3, char &c4);
void reChe(char &c1, char &c2, char &c3, char &c4, char &c5, char &c6, char &c7, char &c8);

char* m = new char[25];

int main(int argc, char** argv) {

    init();

    char* input = argv[1];
    
    char *p = input;
    while (*p) {
        switch (*p++)
        {
        case 'X':
            //cout << "X:" << endl;
            reX();
            //getResult();
            break;
        case 'Y':
            //cout << "Y:" << endl;
            reY();
            //getResult();
            break;
        case 'Z':
            //cout << "Z:" << endl;
            reZ();
            //getResult();
            break;
        default:
            break;
        }
    }

    cout << m[1] << m[2] << m[3] << m[4] << endl;

    system("pause");
    return 0;
}

void getResult() {
    for (int i = 1; i < 25; i++) {
        cout << m[i];
        if (i % 4 == 0) cout << endl;
    }
}

void init() {
    for (int i = 1; i<5; i++) {   //x zheng  
        m[i] = 'R';
    }
    for (int i = 5; i<9; i++) {  //y zheng  
        m[i] = 'G';
    }
    for (int i = 9; i<13; i++) {  //z zheng  
        m[i] = 'Y';
    }
    for (int i = 13; i<17; i++) {  //x fan  
        m[i] = 'O';
    }
    for (int i = 17; i<21; i++) {  //y fan  
        m[i] = 'B';
    }
    for (int i = 21; i<25; i++) {  //z fan  
        m[i] = 'W';
    }
}

void reX() {
    reZheng(m[5], m[6], m[7], m[8]);
    reChe(m[4], m[2], m[9], m[11], m[13], m[15], m[24], m[22]);
}

void reY() {
    reZheng(m[9], m[10], m[11], m[12]);
    reChe(m[2], m[1], m[18], m[17], m[14], m[13], m[6], m[5]);
}

void reZ() {
    reZheng(m[13], m[14], m[15], m[16]);
    reChe(m[8], m[6], m[11], m[12], m[17], m[19], m[23], m[24]);
}

// 顺时针旋转90
void reZheng(char &c1, char &c2, char &c3, char &c4) {
    char t = c1;
    c1 = c3; c3 = c4; c4 = c2; c2 = t;
}
// 侧边
void reChe(char &c1, char &c2, char &c3, char &c4, char &c5, char &c6, char &c7, char &c8) {
    char t1 = c1, t2 = c2;
    c1 = c7, c2 = c8;
    c7 = c5, c8 = c6;
    c5 = c3, c6 = c4;
    c3 = t1, c4 = t2;
}
相关标签: 模拟