/*数字是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;
}
Pocket Cube hdu 5983
最新推荐文章于 2020-02-09 13:03:46 发布