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;
}