HDU 6202 cube cube cube(暴力)

cube cube cube

Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 327680/327680 K (Java/Others)
Total Submission(s): 9327    Accepted Submission(s): 130


Problem Description
Rubick has a strange cube. Can you restore Rubik's cube in 3 steps (including 3)?
Rubik's cube is shown in the following picture:



The plane expansion of the Rubik's cube is shown in the following figure, each number represents the color corresponding to each cube.



The following picture explains how to rotate this strange cube. If you still feel confused, you can refer to
http://www.bilibili.com/video/av8452301/?from=search&seid=11750270100959783079 .


 

Input
The first line contains an integer  T  ( T10 ), the number of test cases.
Each test case consists of 72 integers which correspond to the colors of each location of the Rubik's Cube. Each number represents one color, it's guaranteed that there are exactly 8 colors and each color appears 9 times.
 

Output
For each test case, if you can restore the Rubik's cube in 3 steps, output "YES", else output "NO". (both without quote)
 

Sample Input
  
  
1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 3 3 3 3 3 3 3 3 3 4 4 4 4 4 4 4 4 4 5 5 5 5 5 5 5 5 5 6 6 6 6 6 6 6 6 6 7 7 7 7 7 7 7 7 7 8 8 8 8 8 8 8 8 8
 

Sample Output
  
  
YES
 

Source


【思路】

比赛时以为应该用矩阵啥的来实现转魔方,就想着能不能构造几个合适的变换矩阵,但很显然人脑不适合来想这个问题,这是一道可怕大模拟。比赛时有挺多大学队伍选择了随机化输出,后来听说还有猜测数据一面有三个不同的就还原不了的,居然也过了,只能说出题和出数据的人失误了。后来自己来写,简直写到要吐了……72个位置,共有5种转动方式,每种都有顺逆时针的方向,所以分好类。以后直接怼就行。


【代码】

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;

const int MAXN=80;

int t;
int now[MAXN];
int a[6],b[6];

bool check(int arr[])
{
    for(int i=1;i<=64;i+=9)
        for(int j=i+1;j<=i+8;j++)
            if(arr[j]!=arr[i])return false;
    return true;
}

void init(int a[],int b[])
{
    for(int i=1;i<=72;i++)a[i]=b[i];
}

void up_corner(int a1,int a2,int a3,int a4)
{
    int tmp=now[a4];
    now[a4]=now[a3];
    now[a3]=now[a2];
    now[a2]=now[a1];
    now[a1]=tmp;
}

void mid_corner(int a1,int a2,int a3,
                int b1,int b2,int b3,
                int c1,int c2,int c3,
                int d1,int d2,int d3)
{
    int tmp1=now[d1],tmp2=now[d2],tmp3=now[d3];
    now[d1]=now[c1];now[d2]=now[c2];now[d3]=now[c3];
    now[c1]=now[b1];now[c2]=now[b2];now[c3]=now[b3];
    now[b1]=now[a1];now[b2]=now[a2];now[b3]=now[a3];
    now[a1]=tmp1;now[a2]=tmp2;now[a3]=tmp3;
}

void down_corner(int a1,int a2,int a3,int a4,int a5,
                 int b1,int b2,int b3,int b4,int b5,
                 int c1,int c2,int c3,int c4,int c5,
                 int d1,int d2,int d3,int d4,int d5)
{
    int tmp1=now[d1],tmp2=now[d2],tmp3=now[d3],tmp4=now[d4],tmp5=now[d5];
    now[d1]=now[c1];now[d2]=now[c2];now[d3]=now[c3];now[d4]=now[c4];now[d5]=now[c5];
    now[c1]=now[b1];now[c2]=now[b2];now[c3]=now[b3];now[c4]=now[b4];now[c5]=now[b5];
    now[b1]=now[a1];now[b2]=now[a2];now[b3]=now[a3];now[b4]=now[a4];now[b5]=now[a5];
    now[a1]=tmp1;now[a2]=tmp2;now[a3]=tmp3;now[a4]=tmp4;now[a5]=tmp5;
}

void up_storey(int a1,int a2,int a3,
               int b1,int b2,int b3,
               int c1,int c2,int c3,
               int d1,int d2,int d3,
               int e1,int e2,int e3,int e4,int e5,
               int f1,int f2,int f3,int f4,int f5,
               int g1,int g2,int g3,int g4,int g5)
{
    int tmpa=now[a3];now[a3]=now[a2];now[a2]=now[a1];now[a1]=tmpa;
    int tmpb=now[b3];now[b3]=now[b2];now[b2]=now[b1];now[b1]=tmpb;
    int tmpc=now[c3];now[c3]=now[c2];now[c2]=now[c1];now[c1]=tmpc;
    int tmpd=now[d3];now[d3]=now[d2];now[d2]=now[d1];now[d1]=tmpd;
    int tmp1=now[g1],tmp2=now[g2],tmp3=now[g3],tmp4=now[g4],tmp5=now[g5];
    now[g1]=now[f1];now[g2]=now[f2];now[g3]=now[f3];now[g4]=now[f4];now[g5]=now[f5];
    now[f1]=now[e1];now[f2]=now[e2];now[f3]=now[e3];now[f4]=now[e4];now[f5]=now[e5];
    now[e1]=tmp1;now[e2]=tmp2;now[e3]=tmp3;now[e4]=tmp4;now[e5]=tmp5;
}

void mid_storey(int a0,int b0,int c0,
                int a1,int b1,int c1,
                int a2,int b2,int c2,
                int a3,int b3,int c3,
                int a4,int b4,int c4,
                int a5,int b5,int c5)
{
    int tmpa0=now[a4],tmpb0=now[b4],tmpc0=now[c4];
    int tmpa1=now[a5],tmpb1=now[b5],tmpc1=now[c5];
    now[a4]=now[a2];now[a2]=now[a0];now[a0]=tmpa0;
    now[a5]=now[a3];now[a3]=now[a1];now[a1]=tmpa1;
    now[b4]=now[b2];now[b2]=now[b0];now[b0]=tmpb0;
    now[b5]=now[b3];now[b3]=now[b1];now[b1]=tmpb1;
    now[c4]=now[c2];now[c2]=now[c0];now[c0]=tmpc0;
    now[c5]=now[c3];now[c3]=now[c1];now[c1]=tmpc1;
}

void up_corner_(int a1,int a2,int a3,int a4)
{
    int tmp=now[a1];
    now[a1]=now[a2];
    now[a2]=now[a3];
    now[a3]=now[a4];
    now[a4]=tmp;
}

void mid_corner_(int a1,int a2,int a3,
                 int b1,int b2,int b3,
                 int c1,int c2,int c3,
                 int d1,int d2,int d3)
{
    int tmp1=now[a1],tmp2=now[a2],tmp3=now[a3];
    now[a1]=now[b1];now[a2]=now[b2];now[a3]=now[b3];
    now[b1]=now[c1];now[b2]=now[c2];now[b3]=now[c3];
    now[c1]=now[d1];now[c2]=now[d2];now[c3]=now[d3];
    now[d1]=tmp1;now[d2]=tmp2;now[d3]=tmp3;
}

void down_corner_(int a1,int a2,int a3,int a4,int a5,
                  int b1,int b2,int b3,int b4,int b5,
                  int c1,int c2,int c3,int c4,int c5,
                  int d1,int d2,int d3,int d4,int d5)
{
    int tmp1=now[a1],tmp2=now[a2],tmp3=now[a3],tmp4=now[a4],tmp5=now[a5];
    now[a1]=now[b1];now[a2]=now[b2];now[a3]=now[b3];now[a4]=now[b4];now[a5]=now[b5];
    now[b1]=now[c1];now[b2]=now[c2];now[b3]=now[c3];now[b4]=now[c4];now[b5]=now[c5];
    now[c1]=now[d1];now[c2]=now[d2];now[c3]=now[d3];now[c4]=now[d4];now[c5]=now[d5];
    now[d1]=tmp1;now[d2]=tmp2;now[d3]=tmp3;now[d4]=tmp4;now[d5]=tmp5;
}

void up_storey_(int a1,int a2,int a3,
                int b1,int b2,int b3,
                int c1,int c2,int c3,
                int d1,int d2,int d3,
                int e1,int e2,int e3,int e4,int e5,
                int f1,int f2,int f3,int f4,int f5,
                int g1,int g2,int g3,int g4,int g5)
{
    int tmpa=now[a1];now[a1]=now[a2];now[a2]=now[a3];now[a3]=tmpa;
    int tmpb=now[b1];now[b1]=now[b2];now[b2]=now[b3];now[b3]=tmpb;
    int tmpc=now[c1];now[c1]=now[c2];now[c2]=now[c3];now[c3]=tmpc;
    int tmpd=now[d1];now[d1]=now[d2];now[d2]=now[d3];now[d3]=tmpd;
    int tmp1=now[e1],tmp2=now[e2],tmp3=now[e3],tmp4=now[e4],tmp5=now[e5];
    now[e1]=now[f1];now[e2]=now[f2];now[e3]=now[f3];now[e4]=now[f4];now[e5]=now[f5];
    now[f1]=now[g1];now[f2]=now[g2];now[f3]=now[g3];now[f4]=now[g4];now[f5]=now[g5];
    now[g1]=tmp1;now[g2]=tmp2;now[g3]=tmp3;now[g4]=tmp4;now[g5]=tmp5;
}

void mid_storey_(int a0,int b0,int c0,
                 int a1,int b1,int c1,
                 int a2,int b2,int c2,
                 int a3,int b3,int c3,
                 int a4,int b4,int c4,
                 int a5,int b5,int c5)
{
    int tmpa0=now[a0],tmpb0=now[b0],tmpc0=now[c0];
    int tmpa1=now[a1],tmpb1=now[b1],tmpc1=now[c1];
    now[a0]=now[a2];now[a2]=now[a4];now[a4]=tmpa0;
    now[a1]=now[a3];now[a3]=now[a5];now[a5]=tmpa1;
    now[b0]=now[b2];now[b2]=now[b4];now[b4]=tmpb0;
    now[b1]=now[b3];now[b3]=now[b5];now[b5]=tmpb1;
    now[c0]=now[c2];now[c2]=now[c4];now[c4]=tmpc0;
    now[c1]=now[c3];now[c3]=now[c5];now[c5]=tmpc1;
}

bool dfs(int deep)
{
    if(check(now))
        return true;
    else
    if(deep==3)
        return false;
    int cur[MAXN];
    init(cur,now);
    bool flag=false;
    up_corner(1,10,19,28);
    if(dfs(deep+1))return true;
    init(now,cur);
    up_corner(37,64,55,46);
    if(dfs(deep+1))return true;
    init(now,cur);
    up_corner(68,45,5,36);
    if(dfs(deep+1))return true;
    init(now,cur);
    up_corner(54,14,9,41);
    if(dfs(deep+1))return true;
    init(now,cur);
    up_corner(63,23,18,50);
    if(dfs(deep+1))return true;
    init(now,cur);
    up_corner(59,72,32,27);
    if(dfs(deep+1))return true;

    init(now,cur);
    up_corner_(1,10,19,28);
    if(dfs(deep+1))return true;
    init(now,cur);
    up_corner_(37,64,55,46);
    if(dfs(deep+1))return true;
    init(now,cur);
    up_corner_(68,45,5,36);
    if(dfs(deep+1))return true;
    init(now,cur);
    up_corner_(54,14,9,41);
    if(dfs(deep+1))return true;
    init(now,cur);
    up_corner_(63,23,18,50);
    if(dfs(deep+1))return true;
    init(now,cur);
    up_corner_(59,72,32,27);
    if(dfs(deep+1))return true;

    init(now,cur);
    mid_corner(2,3,4,11,12,13,20,21,22,29,30,31);
    if(dfs(deep+1))return true;
    init(now,cur);
    mid_corner(38,39,40,65,66,67,56,57,58,47,48,49);
    if(dfs(deep+1))return true;
    init(now,cur);
    mid_corner(31,35,34,70,69,65,40,44,43,7,6,2);
    if(dfs(deep+1))return true;
    init(now,cur);
    mid_corner(4,8,7,43,42,38,49,53,52,16,15,11);
    if(dfs(deep+1))return true;
    init(now,cur);
    mid_corner(13,17,16,52,51,47,58,62,61,25,24,20);
    if(dfs(deep+1))return true;
    init(now,cur);
    mid_corner(22,26,25,61,60,56,67,71,70,34,33,29);
    if(dfs(deep+1))return true;

    init(now,cur);
    mid_corner_(2,3,4,11,12,13,20,21,22,29,30,31);
    if(dfs(deep+1))return true;
    init(now,cur);
    mid_corner_(38,39,40,65,66,67,56,57,58,47,48,49);
    if(dfs(deep+1))return true;
    init(now,cur);
    mid_corner_(31,35,34,70,69,65,40,44,43,7,6,2);
    if(dfs(deep+1))return true;
    init(now,cur);
    mid_corner_(4,8,7,43,42,38,49,53,52,16,15,11);
    if(dfs(deep+1))return true;
    init(now,cur);
    mid_corner_(13,17,16,52,51,47,58,62,61,25,24,20);
    if(dfs(deep+1))return true;
    init(now,cur);
    mid_corner_(22,26,25,61,60,56,67,71,70,34,33,29);
    if(dfs(deep+1))return true;

    init(now,cur);
    down_corner(5,6,7,8,9,14,15,16,17,18,23,24,25,26,27,32,33,34,35,36);
    if(dfs(deep+1))return true;
    init(now,cur);
    down_corner(41,42,43,44,45,68,69,70,71,72,59,60,61,62,63,50,51,52,53,54);
    if(dfs(deep+1))return true;
    init(now,cur);
    down_corner(1,3,2,6,5,45,44,40,39,37,46,48,47,51,50,18,17,13,12,10);
    if(dfs(deep+1))return true;
    init(now,cur);
    down_corner(10,12,11,15,14,54,53,49,48,46,55,57,56,60,59,27,26,22,21,19);
    if(dfs(deep+1))return true;
    init(now,cur);
    down_corner(19,21,20,24,23,63,62,58,57,55,64,66,65,69,68,36,35,31,30,28);
    if(dfs(deep+1))return true;
    init(now,cur);
    down_corner(28,30,29,33,32,72,71,67,66,64,37,39,38,42,41,9,8,4,3,1);
    if(dfs(deep+1))return true;

    init(now,cur);
    down_corner_(5,6,7,8,9,14,15,16,17,18,23,24,25,26,27,32,33,34,35,36);
    if(dfs(deep+1))return true;
    init(now,cur);
    down_corner_(41,42,43,44,45,68,69,70,71,72,59,60,61,62,63,50,51,52,53,54);
    if(dfs(deep+1))return true;
    init(now,cur);
    down_corner_(1,3,2,6,5,45,44,40,39,37,46,48,47,51,50,18,17,13,12,10);
    if(dfs(deep+1))return true;
    init(now,cur);
    down_corner_(10,12,11,15,14,54,53,49,48,46,55,57,56,60,59,27,26,22,21,19);
    if(dfs(deep+1))return true;
    init(now,cur);
    down_corner_(19,21,20,24,23,63,62,58,57,55,64,66,65,69,68,36,35,31,30,28);
    if(dfs(deep+1))return true;
    init(now,cur);
    down_corner_(28,30,29,33,32,72,71,67,66,64,37,39,38,42,41,9,8,4,3,1);
    if(dfs(deep+1))return true;

    init(now,cur);
    up_storey(1,5,9,2,7,4,6,8,3,68,54,19,28,30,31,35,36,45,44,43,42,41,14,15,11,12,10);
    if(dfs(deep+1))return true;
    init(now,cur);
    up_storey(28,32,36,29,34,31,33,35,30,59,45,10,5,6,2,3,1,19,21,22,26,27,72,71,70,69,68);
    if(dfs(deep+1))return true;
    init(now,cur);
    up_storey(19,23,27,20,25,22,24,26,21,50,72,1,32,33,29,30,28,10,12,13,17,18,63,62,61,60,59);
    if(dfs(deep+1))return true;
    init(now,cur);
    up_storey(10,14,18,11,16,13,15,17,12,41,63,28,54,53,52,51,50,23,24,20,21,19,1,3,4,8,9);
    if(dfs(deep+1))return true;
    init(now,cur);
    up_storey(41,45,37,43,40,38,44,39,42,36,55,14,68,69,65,66,64,46,48,49,53,54,9,8,7,6,5);
    if(dfs(deep+1))return true;
    init(now,cur);
    up_storey(64,68,72,65,70,67,69,71,66,5,27,46,37,39,40,44,45,36,35,34,33,32,59,60,56,57,55);
    if(dfs(deep+1))return true;
    init(now,cur);
    up_storey(59,63,55,61,58,56,60,62,57,32,18,37,64,66,67,71,72,27,26,25,24,23,50,51,47,48,46);
    if(dfs(deep+1))return true;
    init(now,cur);
    up_storey(46,50,54,48,51,53,47,52,49,23,9,64,55,57,58,62,63,18,17,16,15,14,41,42,38,39,37);
    if(dfs(deep+1))return true;

    init(now,cur);
    up_storey_(1,5,9,2,7,4,6,8,3,68,54,19,28,30,31,35,36,45,44,43,42,41,14,15,11,12,10);
    if(dfs(deep+1))return true;
    init(now,cur);
    up_storey_(28,32,36,29,34,31,33,35,30,59,45,10,5,6,2,3,1,19,21,22,26,27,72,71,70,69,68);
    if(dfs(deep+1))return true;
    init(now,cur);
    up_storey_(19,23,27,20,25,22,24,26,21,50,72,1,32,33,29,30,28,10,12,13,17,18,63,62,61,60,59);
    if(dfs(deep+1))return true;
    init(now,cur);
    up_storey_(10,14,18,11,16,13,15,17,12,41,63,28,54,53,52,51,50,23,24,20,21,19,1,3,4,8,9);
    if(dfs(deep+1))return true;
    init(now,cur);
    up_storey_(41,45,37,43,40,38,44,39,42,36,55,14,68,69,65,66,64,46,48,49,53,54,9,8,7,6,5);
    if(dfs(deep+1))return true;
    init(now,cur);
    up_storey_(64,68,72,65,70,67,69,71,66,5,27,46,37,39,40,44,45,36,35,34,33,32,59,60,56,57,55);
    if(dfs(deep+1))return true;
    init(now,cur);
    up_storey_(59,63,55,61,58,56,60,62,57,32,18,37,64,66,67,71,72,27,26,25,24,23,50,51,47,48,46);
    if(dfs(deep+1))return true;
    init(now,cur);
    up_storey_(46,50,54,48,51,53,47,52,49,23,9,64,55,57,58,62,63,18,17,16,15,14,41,42,38,39,37);
    if(dfs(deep+1))return true;

    init(now,cur);
    mid_storey(29,33,34,70,69,65,40,39,38,49,53,52,16,17,13,20,21,22);
    if(dfs(deep+1))return true;
    init(now,cur);
    mid_storey(20,24,25,61,60,59,67,66,65,40,44,43,7,8,4,11,12,13);
    if(dfs(deep+1))return true;
    init(now,cur);
    mid_storey(67,71,70,34,35,31,2,3,4,11,15,16,52,51,47,58,57,56);
    if(dfs(deep+1))return true;
    init(now,cur);
    mid_storey(49,48,47,58,62,61,25,26,22,29,30,31,2,6,7,43,42,38);
    if(dfs(deep+1))return true;

    init(now,cur);
    mid_storey_(29,33,34,70,69,65,40,39,38,49,53,52,16,17,13,20,21,22);
    if(dfs(deep+1))return true;
    init(now,cur);
    mid_storey_(20,24,25,61,60,59,67,66,65,40,44,43,7,8,4,11,12,13);
    if(dfs(deep+1))return true;
    init(now,cur);
    mid_storey_(67,71,70,34,35,31,2,3,4,11,15,16,52,51,47,58,57,56);
    if(dfs(deep+1))return true;
    init(now,cur);
    mid_storey_(49,48,47,58,62,61,25,26,22,29,30,31,2,6,7,43,42,38);
    if(dfs(deep+1))return true;
    return false;
}

int main()
{
    scanf("%d",&t);
    while(t--){
        for(int i=1;i<=72;i++)
            scanf("%d",&now[i]);
        bool flag=check(now)||dfs(0);
        if(flag)
            printf("YES\n");
        else
            printf("NO\n");
    }
    return 0;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值