解法:暴力!!!
没错,就是暴力!!!
枚举两个相对的面,就可以确定八个角的颜色,于是确定整个正方体。
暴力枚举这两个面,用map统计答案。注意将每个面的四种旋转情况全部加入到map中。
代码
#include<iostream>
#include<cstdio>
#include<map>
using namespace std;
struct cube{
int a,b,c,d;
cube():a(0),b(0),c(0),d(0){}
cube(int m,int n,int p,int q):a(m),b(n),c(p),d(q){}
friend bool operator<(const cube &cb1,const cube &cb2){if(cb1.a!=cb2.a)return cb1.a<cb2.a;if(cb1.b!=cb2.b)return cb1.b<cb2.b;if(cb1.c!=cb2.c)return cb1.c<cb2.c;return cb1.d<cb2.d;}
void rotate(){int t=a;a=b,b=c,c=d,d=t;}
};
class FastFileReader{char buffer[10000001];char *h;int len;inline char gchar(){return *h++;}inline bool validdigit(char c){return c>='0' && c<='9';}public:inline void init(){len=fread(buffer,1,10000000,stdin);h=buffer;}inline int nextint(){register int i=0;register char c;do c=gchar();while(!validdigit(c));do{i=i*10+c-48;c=gchar();}while(validdigit(c));return i;}inline int nextsigned(){register int i=0,f=1;register char c;do{c=gchar();if(c=='-')f=-1;}while(!validdigit(c));do{i=i*10+c-48;c=gchar();}while(validdigit(c));return i*f;}inline long long nextlonglong(){register long long i=0;register char c;do c=gchar();while(!validdigit(c));do{i=i*10+c-48;c=gchar();}while(validdigit(c));return i;}inline long long nextsignedlonglong(){register long long i=0,f=1;register char c;do{c=gchar();if(c=='-')f=-1;}while(!validdigit(c));do{i=i*10+c-48;c=gchar();}while(validdigit(c));return i*f;}inline char nextchar(){register char c;do c=gchar();while(c<=' ');return c;}};
FastFileReader fs;
map<cube,int> m;
int n;
long long ans;
cube c[401];
void insert(cube c,int x){for(int i=1;i<=4;++i)m[c]+=x,c.rotate();}
int main(){
fs.init();n=fs.nextint();for(int i=1;i<=n;++i)c[i].a=fs.nextint(),c[i].b=fs.nextint(),c[i].c=fs.nextint(),c[i].d=fs.nextint(),insert(c[i],1);
for(int i=1;i<=n;++i){
insert(c[i],-1);
for(int j=i+1;j<=n;++j){
insert(c[j],-1);
for(int k=0;k<4;++k){
c[j].rotate();
cube c1(c[i].b,c[i].a,c[j].a,c[j].d),c2(c[i].c,c[i].b,c[j].d,c[j].c),c3(c[i].d,c[i].c,c[j].c,c[j].b),c4(c[i].a,c[i].d,c[j].b,c[j].a);
if(m.count(c1)&&m.count(c2)&&m.count(c3)&&m.count(c4)){long long sum=1ll;sum*=m[c1],insert(c1,-1),sum*=m[c2],insert(c2,-1),sum*=m[c3],insert(c3,-1),ans+=sum*m[c4],insert(c1,1),insert(c2,1),insert(c3,1);}
}
insert(c[j],1);
}
}
printf("%lld",ans);
}