[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 }
原文地址:https://www.cnblogs.com/mcflurry/p/2868047.html