HDU 5983 Pocket Cube (模拟)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5983

题意:给一个2*2*2的魔方,给定每个面上四个小块的数字,问转动不超过一次,能否将魔方拼完整。

题解:因为输入看起来是乱序,没法用循环,就强行模拟了一下输入。接着总共有六个面,每个面有两种方向可以转动,共12种。由于上面顺时针转和下面逆时针转是一样的,就可以缩减成6种。又由于逆时针和顺时针是反着写的,故想3种就可以了。最后再判断一下总共是6个颜色即可。

ac代码:

#include 
#include 
#include
#include
using namespace std;
int a[10][2][2][2];
int b[10][2][2][2];
bool check(){
    setv;
    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;
}

你可能感兴趣的:(模拟)