河南萌新联赛2024第(二)场:南阳理工学院 K - Magic Cube

河南萌新联赛2024第(二)场:南阳理工学院 K - Magic Cube

题目描述

一天,慢羊羊村长手中的宇宙魔方被擎天柱突然夺走了,并且交给了钢铁侠用来给光之国的等离子火花塔供能,以便提前让电击小子苏醒,来拯救这个荒诞的多元宇宙。宇宙魔方处于乱码状态,身为光之国科研战线第一人的派大星一眼就看出了这块宇宙魔方的能量解码,但苦于没有手指头,所以他只能拜托你来解决这个问题。现在,你肩负着宇宙的希望,派大星的智慧,你将竭尽所能,让这个宇宙在光芒中继续璀璨辉煌。

众所周知,宇宙魔方由8个角块,12个棱块,6个中心块组成。其中中心块的相对位置是恒定的,不会随着转动而改变位置。

本题的输入是一个魔方的展开图,我们以黄色为中心块的面作为顶面,红色为中心块的面作为前面,绿色为中心块的面作为右面。定义六种魔方转动操作类型,分别如下:

  1. “R1”:右面顺时针旋转90度
  2. “R2”:右面逆时针旋转90度
  3. “U1”:顶面顺时针旋转90度
  4. “U2”:顶面逆时针旋转90度
  5. “F1”:前面顺时针旋转90度
  6. “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);
}
  • 4
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Wa_Automata

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值