题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5983
题意:给一个2*2*2的魔方,给定每个面上四个小块的数字,问转动不超过一次,能否将魔方拼完整。
题解:因为输入看起来是乱序,没法用循环,就强行模拟了一下输入。接着总共有六个面,每个面有两种方向可以转动,共12种。由于上面顺时针转和下面逆时针转是一样的,就可以缩减成6种。又由于逆时针和顺时针是反着写的,故想3种就可以了。最后再判断一下总共是6个颜色即可。
ac代码:
#include <iostream>
#include <cstdio>
#include<cstring>
#include<set>
using namespace std;
int a[10][2][2][2];
int b[10][2][2][2];
bool check(){
set<int>v;
if(!(b[0][0][0][1] == b[0][0][1][1] && b[0][0][1][1] == b[0][1][0][1] && b[0][1][0][1] == b[0][1][1][1]))
return false;
v.insert(b[0][0][0][1]);
if(!(b[1][1][0][1] == b[1][1][1][1] && b[1][1][1][1] == b[1][1][0][0] && b[1][1][0][0] == b[1][1][1][0]))
return false;
v.insert(b[1][1][0][1]);
if(!(b[2][1][0][0] == b[2][1][1][0] && b[2][1][1][0] == b[2][0][0][0] && b[2][0][0][0] == b[2][0][1][0]))
return false;
v.insert(b[2][1][0][0]);
if(!(b[3][0][0][0] == b[3][0][1][0] && b[3][0][1][0] == b[3][0][0][1] && b[3][0][0][1] == b[3][0][1][1]))
return false;
v.insert(b[3][0][0][0]);
if(!(b[4][0][0][0] == b[4][0][0][1] && b[4][0][0][1] == b[4][1][0][0] && b[4][1][0][0] == b[4][1][0][1]))
return false;
v.insert(b[4][0][0][0]);
if(!(b[5][0][1][1] == b[5][0][1][0] && b[5][0][1][0] == b[5][1][1][1] && b[5][1][1][1] == b[5][1][1][0]))
return false;
v.insert(b[5][0][1][1]);
if(v.size() != 6)
return false;
return true;
}
int main(){
int n;
cin >> n;
while(n--){
cin >> a[0][0][0][1] >> a[0][0][1][1] >> a[0][1][0][1] >> a[0][1][1][1];
cin >> a[1][1][0][1] >> a[1][1][1][1] >> a[1][1][0][0] >> a[1][1][1][0];
cin >> a[2][1][0][0] >> a[2][1][1][0] >> a[2][0][0][0] >> a[2][0][1][0];
cin >> a[3][0][0][0] >> a[3][0][1][0] >> a[3][0][0][1] >> a[3][0][1][1];
cin >> a[4][0][0][0] >> a[4][0][0][1] >> a[4][1][0][0] >> a[4][1][0][1];
cin >> a[5][0][1][1] >> a[5][0][1][0] >> a[5][1][1][1] >> a[5][1][1][0];
memcpy(b, a, sizeof(a));
if(check()) {cout << "YES" << endl; continue;}
int tmp1, tmp2;
//上面逆
tmp1 = b[4][0][0][1], tmp2 = b[4][1][0][1];
b[4][1][0][1] = b[3][0][0][1];
b[4][0][0][1] = b[3][0][1][1];
b[3][0][0][1] = b[5][0][1][1];
b[3][0][1][1] = b[5][1][1][1];
b[5][0][1][1] = b[1][1][1][1];
b[5][1][1][1] = b[1][1][0][1];
b[1][1][1][1] = tmp2;
b[1][1][0][1] = tmp1;
if(check()) {cout << "YES" << endl; continue;}
//上面顺
memcpy(b, a, sizeof(a));
tmp1 = b[4][0][0][1], tmp2 = b[4][1][0][1];
b[4][0][0][1] = b[1][1][0][1];
b[4][1][0][1] = b[1][1][1][1];
b[1][1][0][1] = b[5][1][1][1];
b[1][1][1][1] = b[5][0][1][1];
b[5][0][1][1] = b[3][0][0][1];
b[5][1][1][1] = b[3][0][1][1];
b[3][0][0][1] = tmp2;
b[3][0][1][1] = tmp1;
if(check()) {cout << "YES" << endl; continue;}
//前面逆
memcpy(b, a, sizeof(a));
tmp1 = b[0][1][0][1], tmp2 = b[0][1][1][1];
b[0][1][0][1] = b[5][1][1][1];
b[0][1][1][1] = b[5][1][1][0];
b[5][1][1][1] = b[2][1][1][0];
b[5][1][1][0] = b[2][1][0][0];
b[2][1][1][0] = b[4][1][0][0];
b[2][1][0][0] = b[4][1][0][1];
b[4][1][0][0] = tmp1;
b[4][1][0][1] = tmp2;
if(check()) {cout << "YES" << endl;continue;}
//前面顺
memcpy(b, a, sizeof(a));
tmp1 = b[0][1][0][1], tmp2 = b[0][1][1][1];
b[0][1][0][1] = b[4][1][0][0];
b[0][1][1][1] = b[4][1][0][1];
b[4][1][0][0] = b[2][1][1][0];
b[4][1][0][1] = b[2][1][0][0];
b[2][1][1][0] = b[5][1][1][1];
b[2][1][0][0] = b[5][1][1][0];
b[5][1][1][0] = tmp2;
b[5][1][1][1] = tmp1;
if(check()) {cout << "YES" << endl; continue;}
//右面逆
memcpy(b, a, sizeof(a));
tmp1 = b[0][1][1][1], tmp2 = b[0][0][1][1];
b[0][1][1][1] = b[3][0][1][1];
b[0][0][1][1] = b[3][0][1][0];
b[3][0][1][1] = b[2][0][1][0];
b[3][0][1][0] = b[2][1][1][0];
b[2][0][1][0] = b[1][1][1][0];
b[2][1][1][0] = b[1][1][1][1];
b[1][1][1][1] = tmp2;
b[1][1][1][0] = tmp1;
if(check()) {cout << "YES" << endl; continue;}
//右面顺
memcpy(b, a, sizeof(a));
tmp1 = b[0][1][1][1], tmp2 = b[0][0][1][1];
b[0][1][1][1] = b[1][1][1][0];
b[0][0][1][1] = b[1][1][1][1];
b[1][1][1][0] = b[2][0][1][0];
b[1][1][1][1] = b[2][1][1][0];
b[2][1][1][0] = b[3][0][1][0];
b[2][0][1][0] = b[3][0][1][1];
b[3][0][1][0] = tmp2;
b[3][0][1][1] = tmp1;
if(check()) {cout << "YES" << endl; continue;}
cout << "NO" << endl;
}
return 0;
}