题目
分析
数组a[ ] 存放的是原魔方的情况;数组b[ ] 存放的是旋转之后魔方的情况。
1、模拟旋转的6种情况:
找到一个正方体,标上代表数字,分别模拟6中旋转的情况,将结果存放到b[ ]数组里面;
2、判断旋转之后的魔方是否成功,即判断数组b[]的六个面是否每个面数字一样。
这是一道蛮暴力的题,只要正方体叠的好,没有什么是解决不了滴。
代码
#include<stdio.h>
using namespace std;
int a[25];
//可以有6个步骤
bool pan(int *b){
int cnt=0;
for(int i=0;i<6;i++)
if((b[0+4*i]==b[1+4*i])&&(b[1+4*i]==b[2+4*i])&&(b[2+4*i]==b[3+4*i]))
cnt++;
if(cnt==6) return true;
return false;
}
bool tops(){
int b[25];
for(int i=0;i<24;i++) b[i]=a[i];
int a1=b[4],a2=b[5];//前变成右
b[4]=b[22];b[5]=b[20];
b[22]=b[15];b[20]=b[14];//右变成后
b[15]=b[17];b[14]=b[19];//后变左
b[17]=a1;b[19]=a2;//左变前
return pan(b);
}
bool topn(){
int b[25];
for(int i=0;i<24;i++) b[i]=a[i];
int a1=b[4],a2=b[5];b[4]=b[17];b[5]=b[19];b[17]=b[15];b[19]=b[14];b[15]=b[22];b[14]=b[20];b[22]=a1;b[5]=a2;
return pan(b);
}
bool frontn(){
int b[25];
for(int i=0;i<24;i++) b[i]=a[i];
int a1=b[8],a2=b[9];b[8]=b[19];b[9]=b[18];b[19]=b[3];b[18]=b[2];b[3]=b[23];b[2]=b[22];b[23]=a1;b[22]=a2;
return pan(b);
}
bool fronts(){
int b[25];
for(int i=0;i<24;i++) b[i]=a[i];
int a1=b[8],a2=b[9];b[8]=b[23];b[23]=b[3];b[3]=b[19];b[9]=b[22];b[22]=b[2];b[2]=b[18];b[19]=a1;b[18]=a2;
return pan(b);
}
bool lefts(){
int b[25];
for(int i=0;i<24;i++) b[i]=a[i];
int a1=b[0],a2=b[2];b[0]=b[4];b[4]=b[8];b[8]=b[12];b[2]=b[6];b[6]=b[10];b[10]=b[14];b[12]=a1;b[14]=a2;
return pan(b);
}
bool leftn(){
int b[25];
for(int i=0;i<24;i++) b[i]=a[i];
int a1=b[0],a2=b[2];b[0]=b[12];b[12]=b[8];b[8]=b[4];b[2]=b[14];b[14]=b[10];b[10]=b[6];b[4]=a1;b[6]=a2;
return pan(b);
}
int main()
{
int N;
scanf("%d",&N);
while(N--){
for(int i=0;i<24;i++)
scanf("%d",&a[i]);
//不移动是否可以
if(pan(a)==true) {
printf("YES\n");
continue;
}
bool flag[12],li=false;
flag[0]=tops();flag[1]=topn();
flag[2]=fronts();flag[3]=frontn();
flag[4]=lefts();flag[5]=leftn();
for(int i=0;i<6;i++){
if(flag[i]==true){
li=true;
printf("YES\n");
break;
}
}
if(li==false)
printf("NO\n");
}
}