[ACM]魔方涂色(SD高校ACM周赛3(SDUT))
题目描述
越来越多的人开始玩魔方,理工大学的小明从小钟爱魔方, 但是他注意到魔方的颜色太过单调了,有一天他想给魔方的六个面涂色,摆在他面前的有m种颜料,每种颜料从1到m进行编号,题目给出小明想出的所有的涂抹方法(按照上下左右前后的顺序给出)但是小明忽略了一点,如果将魔方旋转他所想到的涂抹方法可能有重复,比如(1,2,3,4,5,6)与(4,3,1,2,5,6)是一种涂色方案
输入
有一组数据,第一行是n(n<=100000)代表小明想到的方案,下面的n行,每行有六个整数,整数x代表颜料的编号并且(x)满足(x>=1&&x<=1000)
输出
实际的方案总数
示例输入
2 1 2 3 4 5 6 4 3 1 2 5 6
示例输出
1
提示
数据较大,建议用scanf代替cin
比赛的时候不关心什么名次,就一直死磕这个题,至今未果。
弱菜表示只会笨方法……。思路是模拟,把最小号的统一放上面,除去上下的次小号放左面,剩下的前后就确定了。然后就可以用set存了,最后set的大小便是方案数,但是不对,不知是思路错还是哪里没写对……。
未AC代码:
View Code
1 #include <iostream> 2 #include <cstring> 3 #include <cstdio> 4 #include <cstdlib> 5 #include <cmath> 6 #include <string> 7 #include <vector> 8 #include <list> 9 #include <map> 10 #include <set> 11 #include <queue> 12 #include <stack> 13 #include <bitset> 14 #include <algorithm> 15 #include <numeric> 16 #include <functional> 17 using namespace std; 18 typedef long long ll; 19 #define read freopen("in.txt","r",stdin) 20 #define write freopen("out.txt","w",stdout) 21 #define maxn 1005 22 23 struct str 24 { 25 int num[6]; 26 bool operator == ( const str &rhs) const 27 { 28 if((rhs.num[0]==num[0])&&(rhs.num[1]==num[1]) 29 &&(rhs.num[2]==num[2])&&(rhs.num[3]==num[3]) 30 &&(rhs.num[4]==num[4])&&(rhs.num[5]==num[5])) 31 return true; 32 return false; 33 } 34 bool operator < (const str &rhs) const 35 { 36 if(rhs.num[0]==num[0]) 37 if(rhs.num[1]==num[1]) 38 if(rhs.num[2]==num[2]) 39 if(rhs.num[3]==num[3]) 40 if(rhs.num[4]==num[4])return rhs.num[5]>num[5]; 41 else return rhs.num[4]>num[4]; 42 else return rhs.num[3]>num[3]; 43 else return rhs.num[2]>num[2]; 44 else return rhs.num[1]>num[1]; 45 else return rhs.num[0]>num[0]; 46 } 47 }; 48 int findO(int dx){return dx%2?--dx:++dx;} 49 int main() 50 { 51 int n; 52 while(~scanf("%d",&n)) 53 { 54 set<str>st; 55 st.clear(); 56 while(n--) 57 { 58 int num[6]; 59 for(int i=0;i<6;i++)scanf("%d",&num[i]); 60 int min=maxn,dx; 61 /* 62 2 63 1 2 3 4 5 6 64 4 3 1 2 5 6 65 */ 66 for(int i=0;i<6;i++) 67 if(num[i]<min)min=num[i],dx=i; 68 if(dx==1)swap(num[0],num[1]),swap(num[2],num[3]); 69 else if(dx>1) 70 { 71 if(dx%2==0)swap(num[0],num[1]); 72 swap(num[0],num[dx]),swap(num[1],num[findO(dx)]); 73 } 74 75 min=maxn; 76 for(int i=2;i<6;i++) 77 if(num[i]<min)min=num[i],dx=i; 78 if(dx==3)swap(num[2],num[3]),swap(num[4],num[5]); 79 else if(dx>3) 80 { 81 if(dx==4)swap(num[2],num[3]),swap(num[2],num[4]),swap(num[3],num[5]); 82 else swap(num[2],num[4]),swap(num[3],num[5]); 83 } 84 str s; 85 for(int i=0;i<6;i++)s.num[i]=num[i]; 86 st.insert(s); 87 } 88 printf("%d\n",st.size()); 89 } 90 return 0; 91 }