Pocket Cube hdu 5983

/*数字是6个,直接模拟,采取的是按题目的展开面位置来判断是否合法,枚举三种转法,变换数组的值,每两个面造的空间对应一种,没有用滚动数组,强行覆盖*_*!*/
#include<cstdio>
#include<cstring>
#include<set>
using namespace std;
int a[10][10],b[10][10];
int xx()
{
    set<int> pq;
      for(int i=0;i<=7;i++)
        for(int j=2;j<=3;j++)
          pq.insert(a[i][j]);//scanf("%d",&a[i][j]);
       for(int i=0;i<=1;i++)
        for(int j=0;j<=1;j++)
          pq.insert(a[i][j]);//scanf("%d",&a[i][j]);
       for(int i=0;i<=1;i++)
        for(int j=4;j<=5;j++)
         pq.insert(a[i][j]);//scanf("%d",&a[i][j]);
        return pq.size();
}
int f(int i,int j)
{
    int t=b[i][j];
    if(b[i][j+1]==t&&b[i+1][j]==t&&b[i+1][j+1]==t) return 1;
    return 0;
}
int check()
{
    if(f(0,0)&&f(0,2)&&f(0,4)&&f(2,2)&&f(4,2)&&f(6,2)) return 1;
    return 0;
}
void g()
{
    for(int i=0;i<10;i++)
      for(int j=0;j<10;j++)
        b[i][j]=a[i][j];
}
int sov1()
{
     int n=2;g();
       while(n--)
       {
         int temp=b[0][2];
         for(int i=1;i<=7;i++) b[i-1][2]=b[i][2]; //shang
          b[7][2]=temp;
       }
       if(check()) return 1;
        n=2;g();
       while(n--)
       {
           int temp=b[7][2];
         for(int i=6;i>=0;i--) b[i+1][2]=b[i][2];  //xia
           b[0][2]=temp;;
       }
       if(check()) return 1;
    return 0;
}
int sov2()
{
    int c[8];
    int n=2;g();
    for(int i=0;i<=5;i++) c[i]=b[0][i];
    c[6]=b[5][2];c[7]=b[5][3];
       while(n--){
         int temp=c[7];
         for(int i=6;i>=0;i--) c[i+1]=c[i]; //you
         c[0]=temp;
       }
       for(int i=0;i<=5;i++) b[0][i]=c[i];
       b[5][2]=c[6];b[5][3]=c[7];
       if(check()) return 1;
    n=2;g();
    for(int i=0;i<=5;i++) c[i]=b[0][i];
    c[6]=b[5][2];c[7]=b[5][3];
    while(n--)
    {
        int temp=c[0];
        for(int i=1;i<=7;i++) c[i-1]=c[i]; //zuo
        c[7]=temp;
    }
    for(int i=0;i<=5;i++) b[0][i]=c[i];
    b[5][2]=c[6];b[5][3]=c[7];
       if(check()) return 1;
    return 0;
}
int sov3()
{
    int n=2;g();
    int c[8];
    c[0]=b[2][2];c[1]=b[2][3];
    c[2]=b[0][1];c[3]=b[1][1];
    c[4]=b[7][2];c[5]=b[7][3];
    c[6]=b[0][4];c[7]=b[1][4];
    while(n--)
    {
        int temp=c[0];
        for(int i=1;i<=7;i++) c[i-1]=c[i]; //zuo
        c[7]=temp;
    }
    b[2][2]=c[0];b[2][3]=c[1];
    b[0][1]=c[2];b[1][1]=c[3];
    b[7][2]=c[4];b[7][3]=c[5];
    b[0][4]=c[6];b[1][4]=c[7];
    if(check()) return 1;
    n=2;g();
    c[0]=b[2][2];c[1]=b[2][3];
    c[2]=b[0][1];c[3]=b[1][1];
    c[4]=b[7][2];c[5]=b[7][3];
    c[6]=b[0][4];c[7]=b[1][4];
    while(n--)
    {
         int temp=c[7];
         for(int i=6;i>=0;i--) c[i+1]=c[i]; //you
         c[0]=temp;
    }
    b[2][2]=c[0];b[2][3]=c[1];
    b[0][1]=c[2];b[1][1]=c[3];
    b[7][2]=c[4];b[7][3]=c[5];
    b[0][4]=c[6];b[1][4]=c[7];
    if(check()) return 1;
return 0;
}
int main()
{
    int t;
    scanf("%d",&t);
    while(t--)
    {
        memset(a,0,sizeof(a));
       for(int i=0;i<=7;i++)
        for(int j=2;j<=3;j++)
          scanf("%d",&a[i][j]);
       for(int i=0;i<=1;i++)
        for(int j=0;j<=1;j++)
          scanf("%d",&a[i][j]);
       for(int i=0;i<=1;i++)
        for(int j=4;j<=5;j++)
         scanf("%d",&a[i][j]);
         if(xx()!=6){printf("NO\n");continue;}
        g();if(check()){printf("YES\n");continue;}
        if(sov1()||sov2()||sov3()){printf("YES\n");continue;}
          printf("NO\n");
    }
    return 0;
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值