链接:
http://acm.hdu.edu.cn/showproblem.php?pid=5292
题意:
2*2*2魔方,能否通过不超过一次的旋转(90度)使其四个面相同。
思路:
模拟12种旋转方式(其实是六种,算上正反就是12种),相当于把对应位置的值后移两位。然后check连续的四个是否相同就可以了。
HDU 5983 B - Pocket Cube
#include
using namespace std;
int a[6][12]= {{5,6,23,21,16,15,18,20},{7,8,24,22,14,13,17,19},{2,4,6,8,10,12,14,16},{1,3,5,7,9,11,13,15},{19,20,3,4,23,24,10,9},{17,18,1,2,21,22,12,11}};//旋转六次分别对应的改变位置的数的下标(下标是按照读入次序来的)
int num[26];
bool judge(int index,int f)//index对应第几种旋转,f对应顺逆时针
{
int ar[26];
for(int i=1; i<=24; i++)
ar[i]=num[i];
if(f==1)
{
int x1=ar[a[index][0]],x2=ar[a[index][1]];//记录前两个
for(int i=0; i<6; i++)//前移
ar[a[index][i]]=ar[a[index][i+2]];
ar[a[index][6]]=x1;//后两位赋值
ar[a[index][7]]=x2;
}
else if(f==0)//反着来就行
{
int x1=ar[a[index][6]],x2=ar[a[index][7]];
for(int i=7; i>=2; i--)
ar[a[index][i]]=ar[a[index][i-2]];
ar[a[index][0]]=x1;
ar[a[index][1]]=x2;
}
for(int i=1; i<=24; i++)//检查是否相同
{
if(ar[i]==ar[i+1]&&ar[i]==ar[i+2]&&ar[i]==ar[i+3])
{
i=i+3;
}
else
return false;
}
return true;
}
int main()
{
int t;
ios::sync_with_stdio(false);
cin>>t;
while(t--)
{
for(int i=1; i<=24; i++)
cin>>num[i];
int flag=1;
for(int i=1; i<=24; i++)//不转时检查是否相同
{
if(num[i]==num[i+1]&&num[i]==num[i+2]&&num[i]==num[i+3])
{
i=i+3;
}
else
{
flag=0;
break;
}
}
if(flag)
{
cout<<"YES"<