二阶魔方旋转
程序员文章站
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
思路
- 这是一道完全模拟的题目,把数据结构和操作定义出来就行了。
- 先定义了24个char型代表其24个小面,从 1 到 24,每4个组成一个大面:
- 根据定义,写旋转操作。
代码
#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;
}