HDU 5983 Pocket Cube (模拟)

题目链接: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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值