[模拟]HDU 5983 Pocket Cube

2X2的魔方,问拧一下之内能不能使每一面的4个数字都相等。

李博帮推了左右拧和前后拧的移动模式,然后就A了。

#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<iostream>
#include<algorithm>
#include<vector>
#include<set>
#include<map>
#include<stack>
#include<queue>
using namespace std;
#pragma comment(linker, "/STACK:10240000000,10240000000")
#define mem(x,y) memset(x,y,sizeof(x))
#define pb push_back
#define bug puts("===========");
#define REP(i,n) for(int i=0;i<n;i++)
#define REP1(i,n) for(int i=1;i<=n;i++)
#define ALL(A) A.begin(), A.end()
#define T_T for(int _=RD(),test=1;test<=_;test++)
typedef long long ll;
typedef pair<ll ,ll> pii;
#define CHG ch=getchar()
#define FRD x=bo=0; for(CHG;ch<'0'||ch>'9';CHG) if(ch=='-')bo=1;
#define FR2 for(;ch>='0'&&ch<='9';x=(x<<1)+(x<<3)+ch-'0',CHG);
char ch; int bo;
inline bool blank(char ch){return ch==' '||ch=='\n'||ch=='\r'||ch=='\t';}
inline void RD(int &x){ FRD FR2 if (bo)x=-x; }
inline void RD(ll &x){ FRD FR2 if (bo)x=-x; }
inline ll RD(){ ll x; RD(x); return x; }
inline void RD(char *s){///scanf %s
    for (CHG;blank(ch);CHG);
    for (;!blank(ch);CHG)*s++=ch; *s=0;
}
inline void RD(char &c){for(CHG;blank(c);CHG);}
template<class T> inline void OT(T x){
    static char buf[20];
    char *p1=buf;if (!x)*p1++='0';if (x<0)putchar('-'),x=-x;
    while(x)*p1++=x%10+'0',x/=10;
    while(p1--!=buf)putchar(*p1);
}
inline void pe(){puts("");}//输出回车
inline void pk(){putchar(' ');}//输出空格
const double eps=1e-8;
const ll  inf=1e15;
const int maxn=1e5+70;
#define Mytype ll
#define pii pair<int,int>
/*======================================*/

struct cube{
    int a[6][4];
    
};
bool judge(cube a){
    for(int i=0;i<6;i++)
        for(int j=1;j<4;j++)
            if(a.a[i][j]!=a.a[i][j-1])return 0;
    return 1;
}
cube down(cube a){
    cube b;
    for(int i=0;i<6;i++)
        for(int j=0;j<4;j++)
            b.a[i][j]=a.a[i][j];
    for(int i=0;i<4;i++)
    {
        int j=(i+1)%4;
        b.a[j][0]=a.a[i][0];
        b.a[j][2]=a.a[i][2];
    }
    return b;
}
cube up(cube a){
    cube b;
    for(int i=0;i<6;i++)
        for(int j=0;j<4;j++)
            b.a[i][j]=a.a[i][j];
    for(int i=0;i<4;i++)
    {
        int j=(i-1+4)%4;
        b.a[j][0]=a.a[i][0];
        b.a[j][2]=a.a[i][2];
    }
    return b;
}
cube left(cube a){
    cube b;
    for(int i=0;i<6;i++)
        for(int j=0;j<4;j++)
            b.a[i][j]=a.a[i][j];
    b.a[4][0]=a.a[2][3],b.a[4][1]=a.a[2][2];
    b.a[0][0]=a.a[4][0],b.a[0][1]=a.a[4][1];
    b.a[5][0]=a.a[0][0],b.a[5][1]=a.a[0][1];
    b.a[2][3]=a.a[5][0],b.a[2][2]=a.a[5][1];
    return b;
}
cube right(cube a){
    cube b;
    for(int i=0;i<6;i++)
        for(int j=0;j<4;j++)
            b.a[i][j]=a.a[i][j];
    b.a[2][3]=a.a[4][0],b.a[2][2]=a.a[4][1];
    b.a[4][0]=a.a[0][0],b.a[4][1]=a.a[0][1];
    b.a[0][0]=a.a[5][0],b.a[0][1]=a.a[5][1];
    b.a[5][0]=a.a[2][3],b.a[5][1]=a.a[2][2];
    return b;
}
cube front(cube a){
    cube b;
    for(int i=0;i<6;i++)
        for(int j=0;j<4;j++)
            b.a[i][j]=a.a[i][j];
    b.a[5][0]=a.a[3][2],b.a[5][2]=a.a[3][3];
    b.a[1][0]=a.a[5][2],b.a[1][1]=a.a[5][0];
    b.a[4][1]=a.a[1][0],b.a[4][3]=a.a[1][1];
    b.a[3][2]=a.a[4][3],b.a[3][3]=a.a[4][1];
    return b;
}
cube back(cube a){
    cube b;
    for(int i=0;i<6;i++)
        for(int j=0;j<4;j++)
            b.a[i][j]=a.a[i][j];
    b.a[3][2]=a.a[5][0],b.a[3][3]=a.a[5][2];
    b.a[5][2]=a.a[1][0],b.a[5][0]=a.a[1][1];
    b.a[1][0]=a.a[4][1],b.a[1][1]=a.a[4][3];
    b.a[4][3]=a.a[3][2],b.a[4][1]=a.a[3][3];
    return b;
}
int main()
{
    T_T{
        cube now;
      for(int i=0;i<6;i++)
          for(int j=0;j<4;j++)
            scanf("%d",&now.a[i][j]);
      int fl=0;
      if(judge(now))fl=1;
      if(!fl){
          
          cube tmp=down(now);
          if(judge(tmp)){
              fl=1;
              goto pt;
          }
         tmp=up(now);
          if(judge(tmp)){
              fl=1;
              goto pt;
          }
           tmp=left(now);
          if(judge(tmp)){
              fl=1;
              goto pt;
          }
         tmp=right(now);
          if(judge(tmp)){
              fl=1;
              goto pt;
          }
           tmp=front(now);
          if(judge(tmp)){
              fl=1;
              goto pt;
          }
          tmp=back(now);
          if(judge(tmp)){
              fl=1;
              goto pt;
          }
      }
      pt:if(fl)puts("YES");
      else puts("NO");
      }
    return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值