您的位置:首页 > 其它

国庆训练赛第二场 模拟 能否一步还原二阶魔方

2018-10-03 20:32 190 查看

http://acm.hdu.edu.cn/showproblem.php?pid=5983

两种情况

一、一开始就还原好

二、要想一步还原  一定是有两面是好的(且是对立)

上下, 左右, 前后

有两层 可以发现每层模拟一下顺逆时针 会出现重复

所以可以得出结论 一共就3* 2种情况 枚举

[code]#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;

bool same(int a, int b, int c, int d){
if (a == b && a == c && a == d)
return true;
return false;
}

int a[7][5];
int b[7];
int main(){
int t;
scanf("%d", &t);
while (t--){
memset(b, 0, sizeof(b));
for (int i = 1; i <= 6; ++i){
b[i] = 1;
for (int j = 1; j <= 4; ++j){
scanf("%d", &a[i][j]);
//顺便看下 这个面是不是都一个颜色
if (j >= 2){
if (a[i][j] != a[i][j - 1])
b[i] = 0;
}
}
}
int success = 0;
//一开始就好的情况
if (same(a[1][1], a[1][2], a[1][3], a[1][4]) && same(a[2][1], a[2][2], a[2][3], a[2][4]) && same(a[3][1], a[3][2], a[3][3], a[3][4]) && same(a[4][1], a[4][2], a[4][3], a[4][4]) && same(a[5][1], a[5][2], a[5][3], a[5][4]) && same(a[6][1], a[6][2], a[6][3], a[6][4]))
success = 1;
//转一步  一定就是有对立面 颜色相同  即上下13, 左右56, 前后24  只需转一层顺逆 就好了 不是转两次顺逆 因为重复了
//上下面同
if (b[1] && b[3] && same(a[2][1], a[2][2], a[5][3], a[5][1]) && same(a[5][4], a[5][2], a[4][1], a[4][2])&& same(a[4][3], a[4][4], a[6][4], a[6][2])&& same(a[6][3], a[6][1], a[2][3], a[2][4])) success = 1;
if (b[1] && b[3] && same(a[2][1], a[2][2], a[6][4], a[6][2]) && same(a[6][3], a[6][1], a[4][1], a[4][2])&& same(a[4][3], a[4][4], a[5][3], a[5][1])&& same(a[5][4], a[5][2], a[2][3], a[2][4])) success = 1;

//左右同
if (b[5] && b[6] && same(a[2][2], a[2][4], a[1][3], a[1][1]) && same(a[1][2], a[1][4], a[4][3], a[4][1])&& same(a[4][4], a[4][2], a[3][1], a[3][3])&& same(a[3][2], a[3][4], a[2][1], a[2][3])) success = 1;
if (b[5] && b[6] && same(a[2][2], a[2][4], a[3][1], a[3][3]) && same(a[3][2], a[3][4], a[4][1], a[4][3])&& same(a[4][2], a[4][4], a[1][1], a[1][3])&& same(a[1][2], a[1][4], a[2][1], a[2][3])) success = 1;

//前后同
if (b[2] && b[4] && same(a[1][3], a[1][4], a[5][2], a[5][1]) && same(a[5][4], a[5][3], a[3][3], a[3][4])&& same(a[3][1], a[3][2], a[6][1], a[6][2])&& same(a[6][3], a[6][4], a[1][1], a[1][2])) success = 1;
if (b[2] && b[4] && same(a[1][3], a[1][4], a[6][1], a[6][2]) && same(a[6][3], a[6][4], a[3][3], a[3][4])&& same(a[3][1], a[3][2], a[5][2], a[5][1])&& same(a[5][3], a[5][4], a[1][1], a[1][2])) success = 1;

if (success)
puts("YES");
else
puts("NO");
}
return 0;
}

 

阅读更多
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: