河南萌新联赛2024第(二)场:南阳理工学院 K - Magic Cube
题目描述
一天,慢羊羊村长手中的宇宙魔方被擎天柱突然夺走了,并且交给了钢铁侠用来给光之国的等离子火花塔供能,以便提前让电击小子苏醒,来拯救这个荒诞的多元宇宙。宇宙魔方处于乱码状态,身为光之国科研战线第一人的派大星一眼就看出了这块宇宙魔方的能量解码,但苦于没有手指头,所以他只能拜托你来解决这个问题。现在,你肩负着宇宙的希望,派大星的智慧,你将竭尽所能,让这个宇宙在光芒中继续璀璨辉煌。
众所周知,宇宙魔方由8个角块,12个棱块,6个中心块组成。其中中心块的相对位置是恒定的,不会随着转动而改变位置。
本题的输入是一个魔方的展开图,我们以黄色为中心块的面作为顶面,红色为中心块的面作为前面,绿色为中心块的面作为右面。定义六种魔方转动操作类型,分别如下:
- “R1”:右面顺时针旋转90度
- “R2”:右面逆时针旋转90度
- “U1”:顶面顺时针旋转90度
- “U2”:顶面逆时针旋转90度
- “F1”:前面顺时针旋转90度
- “F2”:前面逆时针旋转90度
请你在规定时间内使用以上操作,计算出复原步骤并输出。保证本题的所有测试都存在步骤数不超过 8 的正确解。
输入描述:
输入是一个魔方以黄色为中心块的面为顶面的展开图,包括 9 行,由大写字母 {Y (黄色) , R (红色) , G (绿色) , O (橙色) , B (蓝色) , W (白色) }组成,保证给定的魔方展开图其各个颜色中心块的相对位置不变,格式如下:
O O O
O O O
O O O
B B B Y Y Y G G G W W W
B B B Y Y Y G G G W W W
B B B Y Y Y G G G W W W
R R R
R R R
R R R
输出描述:
先输出单行一个整数 n 表示需要的操作数量
再输出 n 行,每行一个操作
如果有多种解决方案,输出一种即可
(因存在步骤数不超过 8 的正确解,故限定输出的操作数量 n 不大于 1000)
示例1
输入
O O O
O O O
O O O
B B B Y Y Y G G G W W W
B B B Y Y Y G G G W W W
B B B Y Y Y G G G W W W
R R R
R R R
R R R
输出
0
示例2
输入
O O O
O O O
B B B
B B R Y Y Y O G G W W W
B B R Y Y Y O G G W W W
B B R Y Y Y O G G W W W
G G G
R R R
R R R
输出
1
U2
示例3
输入
O O O
O O O
O O O
B B B Y Y Y G G G W W W
B B B Y Y Y G G G W W W
Y Y Y G G G W W W B B B
R R R
R R R
R R R
输出
1
F1
示例4
输入
O O Y
O O Y
W R R
B B G R Y Y B G G O W W
B B G R Y Y B G G O W W
B B G R Y Y B G G O W W
Y O O
R R W
R R W
输出
3
U1
U1
R2
#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
char h[60];
/*
1 2 3
4 5 6
7 8 9
10 11 12 13 14 15 16 17 18 19 20 21
22 23 24 25 26 27 28 29 30 31 32 33
34 35 36 37 38 39 40 41 42 43 44 45
46 47 48
49 50 51
52 53 54
*/
void R1()
{
char x1,x2,x3;
x1 = h[3],x2 = h[6],x3 = h[9];
h[3] = h[15],h[15] = h[48],h[48] = h[43];
h[9] = h[39],h[39] = h[54],h[54] = h[19];
h[6] = h[27],h[27] = h[51],h[51] = h[31];
h[43] = x1, h[31] = x2, h[19] = x3;
x1 = h[18],h[18] = h[16],h[16] = h[40],h[40] = h[42],h[42] = x1;
x1 = h[17],h[17] = h[28],h[28] = h[41],h[41] = h[30],h[30] = x1;
}
void R2()
{
for(int i=1; i<=3; i++)
R1();
}
void U1()
{
char x1,x2,x3;
x1 = h[7], x2 = h[8], x3 = h[9];
h[7] = h[36], h[8] = h[24], h[9] = h[12];
h[36] = h[48], h[24] = h[47],h[12] = h[46];
h[48] = h[16], h[47] = h[28],h[46] = h[40];
h[16] = x1,h[28] = x2,h[40] = x3;
x1 = h[13],h[13] = h[37],h[37] = h[39],h[39] = h[15],h[15] = x1;
x1 = h[14],h[14] = h[25], h[25] = h[38],h[38] = h[27],h[27] = x1;
}
void U2()
{
for(int i=1; i<=3; i++)
U1();
}
void F1()
{
char x1,x2,x3;
x1 = h[43],x2 = h[44],x3 = h[45];
h[43] = h[40],h[44] = h[41],h[45] = h[42];
h[40] = h[37],h[41] = h[38],h[42] = h[39];
h[37] = h[34],h[38] = h[35],h[39] = h[36];
h[34] = x1,h[35] = x2,h[36] = x3;
x1 = h[46],h[46] = h[52],h[52] = h[54],h[54] = h[48],h[48] = x1;
x1 = h[47],h[47] = h[49],h[49] = h[53],h[53] = h[51],h[51] = x1;
}
void F2()
{
for(int i=1; i<=3; i++)
F1();
}
char str[] = {
' ','O','O','O',
'O','O','O',
'O','O','O',
'B','B','B','Y','Y','Y','G','G','G','W','W','W',
'B','B','B','Y','Y','Y','G','G','G','W','W','W',
'B','B','B','Y','Y','Y','G','G','G','W','W','W',
'R','R','R',
'R','R','R',
'R','R','R'
};
int check()
{
for(int i = 1; i<=54; i++)
if(h[i]!=str[i])
return 0;
return 1;
}
void dfs(string s,int cot)
{
if(cot>9) return;
if(check())
{
cout<<cot<<endl;
for(int i=0; i<s.size(); i+=2)
cout<<s[i]<<s[i+1]<<endl;
exit(0);
}
R1();
dfs(s+"R1",cot+1);
R2();
R2();
dfs(s+"R2",cot+1);
R1();
U1();
dfs(s+"U1",cot+1);
U2();
U2();
dfs(s+"U2",cot+1);
U1();
F1();
dfs(s+"F1",cot+1);
F2();
F2();
dfs(s+"F2",cot+1);
F1();
}
int main()
{
for(int i=1; i<=54; i++)
cin>>h[i];
dfs("",0);
}