有的童鞋干脆把所有排列方式归类了......例如这个叫brainail的家伙
灰常强悍的做法:
#include<iostream> #include<vector> using namespace std; #define forr(i,x,y) for(int i=(int)(x); i<=(int)(y); i++) int p[24][6]={ {1,2,3,4,5,6},{1,2,6,5,3,4},{1,2,4,3,6,5},{1,2,5,6,4,3},{2,1,4,3,5,6},{2,1,6,5,4,3},{2,1,3,4,6,5},{2,1,5,6,3,4}, {3,4,2,1,5,6},{3,4,6,5,2,1},{3,4,1,2,6,5},{3,4,5,6,1,2},{4,3,6,5,1,2},{4,3,2,1,6,5},{4,3,5,6,2,1},{4,3,1,2,5,6}, {5,6,3,4,2,1},{5,6,1,2,3,4},{5,6,4,3,1,2},{5,6,2,1,4,3},{6,5,3,4,1,2},{6,5,2,1,3,4},{6,5,4,3,2,1},{6,5,1,2,4,3}}; int n,a[7],b[7],id[7][7][7][7][7][7],m=0,x=0; vector< vector<int> > y(100100); int main() { scanf("%d",&n); forr(i,1,n) { scanf("%d %d %d %d %d %d",&a[3],&a[4],&a[2],&a[5],&a[1],&a[6]); forr(q,0,23) if(x=id[a[p[q][0]]][a[p[q][1]]][a[p[q][2]]][a[p[q][3]]][a[p[q][4]]][a[p[q][5]]])break; if(!x) { y[++m].push_back(i); id[a[1]][a[2]][a[3]][a[4]][a[5]][a[6]]=m; } else y[x].push_back(i); } printf("%d/n",m); forr(i,1,m) { forr(j,0,y[i].size()-1) printf("%d ",y[i][j]); printf("/n"); } }
为这种数行解决问题的人, 我们要尊敬, 但千万不要膜拜, 因为我们做的不是数学题.
还是用最Eazy的方法...旋转比较...
为了不瞎转, 我们先固定一个骰子, 然后将令一个骰子的一个面和他对齐, 这样只剩下4种方式,
一转就出来了.
灰常朴素的做法:
#include<iostream> using namespace std; int A[100001][6]; int n,p; int T[100001][2]; int node[100001]; void convert(int d,int i) { int temp[6],j; if(!i) return; for(j=0;j<6;j++) temp[j]=A[d][j]; if(i==1) { A[d][0]=temp[1];A[d][1]=temp[0]; A[d][2]=temp[4];A[d][4]=temp[2]; return; } if(i==2) { A[d][0]=temp[2];A[d][4]=temp[0]; A[d][1]=temp[4];A[d][2]=temp[1]; return; } if(i==3) { A[d][0]=temp[3];A[d][1]=temp[5]; A[d][5]=temp[0];A[d][3]=temp[1]; return; } if(i==4) { A[d][0]=temp[4];A[d][2]=temp[0]; A[d][1]=temp[2];A[d][4]=temp[1]; return; } if(i==5) { A[d][0]=temp[5];A[d][5]=temp[1]; A[d][1]=temp[3];A[d][3]=temp[0]; return; } } int cmp(int d,int s) { int i,j; for(i=0;i<6;i++) if(A[d][i]==A[s][0]) break; convert(d,i); if(A[d][1]!=A[s][1]) return 0; for(i=2;i<6;i++) if(A[d][i]==A[s][2]) break; if(i==2) { if(A[d][2]==A[s][2]&&A[d][3]==A[s][3]&& A[d][4]==A[s][4]&&A[d][5]==A[s][5]) return 1; else return 0; } if(i==3) { if(A[d][3]==A[s][2]&&A[d][4]==A[s][3]&& A[d][5]==A[s][4]&&A[d][2]==A[s][5]) return 1; else return 0; } if(i==4) { if(A[d][4]==A[s][2]&&A[d][5]==A[s][3]&& A[d][2]==A[s][4]&&A[d][3]==A[s][5]) return 1; else return 0; } if(i==5) { if(A[d][5]==A[s][2]&&A[d][2]==A[s][3]&& A[d][3]==A[s][4]&&A[d][4]==A[s][5]) return 1; else return 0; } return 1; } int main() { int i,j,k,flag; scanf("%d",&n); for(i=1;i<=n;i++) for(j=0;j<6;j++) scanf("%d",&A[i][j]); T[1][0]=T[1][1]=1;p=1; for(i=2;i<=n;i++) { flag=0; for(j=1;j<=p;j++) if(cmp(i,T[j][0])) { node[i]=T[j][0]; T[j][1]++; flag=1; break; } if(!flag) { p++;T[p][0]=i;T[p][1]=1;node[i]=i; } } printf("%d/n",p); for(i=1;i<=p;i++) { printf("%d",T[i][0]); for(j=T[i][0]+1;j<=n;j++) if(node[j]==T[i][0]) printf(" %d",j); printf("/n"); } return 0; }