正方体选择一个为顶面,再在剩下四个中选择一个为侧面,则唯一确定一个正方体,本题枚举24种。
#include<cstdio>
#include<iostream>
#include<vector>
#include<queue>
#include<algorithm>
#include<string>
#include<cstdlib>
#include<map>
#include<set>
#include<cmath>
#include<cstring>
#include<cctype>
#include<climits>
#include<memory>
#include<climits>
using namespace std;
#define LL long long
#define INT (1<<31)-1;
const int maxn=1000;
int _left[]={0,3,1,4,2,5};
int up[]={1,5,2,3,0,4};
char s1[maxn],s2[maxn],s[maxn];
void rot(int *T,char *p)
{
char t[maxn];
strcpy(t,p);
for(int i=0;i<6;i++)
p[i]=t[T[i]];
}
int rotate()
{
char t[maxn];
for(int i=0;i<6;i++)
{
strcpy(t,s1);
if(i==1) rot(up,t);
if(i==2) {rot(_left,t);rot(_left,t);rot(_left,t);rot(up,t);}
if(i==3) {rot(_left,t);rot(up,t);}
if(i==4) {rot(_left,t);rot(_left,t);rot(up,t);}
if(i==5) {rot(up,t);rot(up,t);}
for(int j=0;j<4;j++)
{
rot(_left,t);
if(strcmp(t,s2)==0)
return 1;
}
}
return 0;
}
int main()
{
while(gets(s))
{
for(int i=0;i<6;i++)
s1[i]=s[i];
s1[6]='\0';
for(int i=6;i<12;i++)
s2[i-6]=s[i];
s2[6]='\0';
if(rotate())
cout<<"TRUE"<<endl;
else
cout<<"FALSE"<<endl;
}
return 0;
}
然而让队友做了一发,队友神奇的思想竟然分分钟A了,看来还是我太笨,直接看代码:
string str;
int a[200][200];
int b[200][200];
int main()
{
while( cin >> str ){
memset(a, 0, sizeof(a));
memset(b, 0, sizeof(b));
for(int i = 0; i < 3; ++i){
a[str[i]][str[5 - i]]++;
a[str[5 - i]][str[i]]++;
}
for(int i = 6; i < 9; ++i){
b[str[i]][str[17 - i]]++;
b[str[17 - i]][str[i]]++;
}
bool flag = 1;
for(int i = 0; i < 3; ++i)
if(a[str[i]][str[5 - i]] != b[str[i]][str[5 - i]])
flag = 0;
if(flag)
puts("TRUE");
else
puts("FALSE");
}
return 0;
}