hdu5836, 2016CCPC网络赛

题目大意:给你一个纯白色的魔方,给其中n<=5个格子涂上黑色,然后随便扭,问有多少种可达状态(去掉旋转后可得到的重复情况)

傻逼一样的题目,暴力直接做就行,赛场上想去重时想乱了。其实给魔方加上一个旋转中间层就好处理了。我这里贴一下代码当做是模板了。

 

 

  1 #include <cstdio>
  2 #include <iostream>
  3 #include <cstring>
  4 #include <algorithm>
  5 #include <cmath>
  6 #include <queue>
  7 
  8 using namespace std;
  9 
 10 #define LL long long
 11 #define MAXN 54
 12 #define hash MY_HASH
 13 #define MOD 999997
 14 #define FMZ 0
 15 #define BMZ 5
 16 #define UMZ 2
 17 #define DMZ 3
 18 #define LMZ 4
 19 #define RMZ 1
 20 
 21 int a[MAXN], ans, n;
 22 queue <LL > q;
 23 vector <LL > hash[MOD];
 24 
 25 struct MagicCube{
 26     typedef char Elem;
 27     #define f c[0]
 28     #define b c[5]
 29     #define u c[2]
 30     #define d c[3]
 31     #define l c[4]
 32     #define r c[1]
 33 
 34 //    Elem f[9], b[9], u[9], d[9], l[9], r[9], tmp[9], ch;
 35     Elem ch, tmp[9], c[6][9];
 36 
 37     void init() {
 38         for (int i = 0; i < 9; ++i) u[i] = a[i];
 39         for (int i = 0; i < 9; ++i) l[i] = a[i+9];
 40         for (int i = 0; i < 9; ++i) f[i] = a[i+18];
 41         for (int i = 0; i < 9; ++i) r[i] = a[i+27];
 42         for (int i = 0; i < 9; ++i) b[i] = a[i+36];
 43         for (int i = 0; i < 9; ++i) d[i] = a[i+45];
 44     }
 45     void decode(LL code) {
 46         for (int i = 0; i < 9; ++i) {u[i] = code & 1; code >>= 1;}
 47         for (int i = 0; i < 9; ++i) {l[i] = code & 1; code >>= 1;}
 48         for (int i = 0; i < 9; ++i) {f[i] = code & 1; code >>= 1;}
 49         for (int i = 0; i < 9; ++i) {r[i] = code & 1; code >>= 1;}
 50         for (int i = 0; i < 9; ++i) {b[i] = code & 1; code >>= 1;}
 51         for (int i = 0; i < 9; ++i) {d[i] = code & 1; code >>= 1;}
 52     }
 53 
 54     LL encode() {
 55         LL res = 0;
 56         for (int i = 0; i < 9; ++i) if (u[i]) res = res + (1LL << (i + 0));
 57         for (int i = 0; i < 9; ++i) if (l[i]) res = res + (1LL << (i + 9));
 58         for (int i = 0; i < 9; ++i) if (f[i]) res = res + (1LL << (i + 18));
 59         for (int i = 0; i < 9; ++i) if (r[i]) res = res + (1LL << (i + 27));
 60         for (int i = 0; i < 9; ++i) if (b[i]) res = res + (1LL << (i + 36));
 61         for (int i = 0; i < 9; ++i) if (d[i]) res = res + (1LL << (i + 45));
 62         return res;
 63     }
 64 
 65     int right_rotate(Elem a[9]) {
 66         for (int i = 0; i < 9; ++i) tmp[i] = a[i];
 67         for (int i = 0; i < 3; ++i)
 68             for (int j = 0; j < 3; ++j) 
 69                 a[i*3+j] = tmp[3*(2 - j) + i];
 70     }
 71 
 72     void L(int cnt = 1) {
 73         for (; cnt>0; --cnt) {
 74             right_rotate(l);
 75             ch=u[0];u[0]=b[8];b[8]=d[0];d[0]=f[0];f[0]=ch;
 76             ch=u[3];u[3]=b[5];b[5]=d[3];d[3]=f[3];f[3]=ch;
 77             ch=u[6];u[6]=b[2];b[2]=d[6];d[6]=f[6];f[6]=ch;
 78         }
 79     }
 80     void R(int cnt = 1) {
 81         for (; cnt>0; --cnt) {
 82             right_rotate(r);
 83             ch=u[2];u[2]=f[2];f[2]=d[2];d[2]=b[6];b[6]=ch;
 84             ch=u[5];u[5]=f[5];f[5]=d[5];d[5]=b[3];b[3]=ch;
 85             ch=u[8];u[8]=f[8];f[8]=d[8];d[8]=b[0];b[0]=ch;
 86         }
 87     }
 88     void U(int cnt = 1) {
 89         for (; cnt>0; --cnt) {
 90             right_rotate(u);
 91             ch=f[0];f[0]=r[0];r[0]=b[0];b[0]=l[0];l[0]=ch;
 92             ch=f[1];f[1]=r[1];r[1]=b[1];b[1]=l[1];l[1]=ch;
 93             ch=f[2];f[2]=r[2];r[2]=b[2];b[2]=l[2];l[2]=ch;    
 94         }
 95     }
 96     void D(int cnt = 1) {
 97         for (; cnt>0; --cnt) {
 98             right_rotate(d);
 99             ch=f[6];f[6]=l[6];l[6]=b[6];b[6]=r[6];r[6]=ch;
100             ch=f[7];f[7]=l[7];l[7]=b[7];b[7]=r[7];r[7]=ch;
101             ch=f[8];f[8]=l[8];l[8]=b[8];b[8]=r[8];r[8]=ch;
102         }
103     }
104     void F(int cnt = 1) {
105         for (; cnt > 0; --cnt) {
106             right_rotate(f);
107             ch=u[6];u[6]=l[8];l[8]=d[2];d[2]=r[0];r[0]=ch;
108             ch=u[7];u[7]=l[5];l[5]=d[1];d[1]=r[3];r[3]=ch;
109             ch=u[8];u[8]=l[2];l[2]=d[0];d[0]=r[6];r[6]=ch;
110         }
111     }
112     void B(int cnt = 1) {
113         for (; cnt > 0; --cnt) {
114             right_rotate(b);
115             ch=u[0];u[0]=r[2];r[2]=d[8];d[8]=l[6];l[6]=ch;
116             ch=u[1];u[1]=r[5];r[5]=d[7];d[7]=l[3];l[3]=ch;
117             ch=u[2];u[2]=r[8];r[8]=d[6];d[6]=l[0];l[0]=ch;
118         }
119     }
120     void MI() {
121         //ch=f[3],f[3]=l[5],l[5]=l[4],l[4]=l[3],l[3]=b[5],b[5]=b[4],b[4]=b[3],b[3]=r[5],r[5]=r[4],r[4]=r[3],r[3]=f[5],f[5]=f[4],f[4]=ch;
122         ch=f[3]; f[3]=r[3]; r[3]=b[3]; b[3]=l[3]; l[3]=ch;
123         ch=f[4]; f[4]=r[4]; r[4]=b[4]; b[4]=l[4]; l[4]=ch;
124         ch=f[5]; f[5]=r[5]; r[5]=b[5]; b[5]=l[5]; l[5]=ch;
125     //follow U
126     }
127     void MJ() {
128 //        ch=u[5],u[5]=r[1],r[1]=r[4],r[4]=r[7],r[7]=d[5],d[5]=d[4],d[4]=d[3],d[3]=l[7],l[7]=l[4],l[4]=l[1],l[1]=u[3],u[3]=u[4],u[4]=ch;
129         ch=u[3]; u[3]=l[7]; l[7]=d[5]; d[5]=r[1]; r[1]=ch;
130         ch=u[4]; u[4]=l[4]; l[4]=d[4]; d[4]=r[4]; r[4]=ch;
131         ch=u[5]; u[5]=l[1]; l[1]=d[3]; d[3]=r[7]; r[7]=ch;
132     //follow F
133     }
134     void MK() {
135 //        ch=u[1],u[1]=u[4],u[4]=u[7],u[7]=f[1],f[1]=f[4],f[4]=f[7],f[7]=d[1],d[1]=d[4],d[4]=d[7],d[7]=b[7],b[7]=b[4],b[4]=b[1],b[1]=ch;
136 
137         ch=u[1]; u[1]=b[7]; b[7]=d[1]; d[1]=f[1]; f[1]=ch;
138         ch=u[4]; u[4]=b[4]; b[4]=d[4]; d[4]=f[4]; f[4]=ch;
139         ch=u[7]; u[7]=b[1]; b[1]=d[7]; d[7]=f[7]; f[7]=ch;
140     //follow L
141     }
142     void print() {
143         for (int i = 0; i < 9; ++i) cout << (int)f[i]; cout << endl;
144         for (int i = 0; i < 9; ++i) cout << (int)d[i]; cout << endl;
145         for (int i = 0; i < 9; ++i) cout << (int)l[i]; cout << endl;
146         for (int i = 0; i < 9; ++i) cout << (int)r[i]; cout << endl;
147         for (int i = 0; i < 9; ++i) cout << (int)u[i]; cout << endl;
148         for (int i = 0; i < 9; ++i) cout << (int)b[i]; cout << endl;
149     }
150     #undef f 
151     #undef b
152     #undef u
153     #undef d
154     #undef l
155     #undef r
156 
157 } mc;
158 
159 inline void addHash(const LL &x) {
160     hash[x%MOD].push_back(x);    
161 }
162 
163 inline bool inHash(const LL &x) {
164     int t = x % MOD;
165     for (int i = 0; i <    hash[t].size(); ++i) {
166         if (hash[t][i] == x) return true;
167     }
168     return false;
169 }
170 
171 inline void rotateI(MagicCube &t) {
172     t.U();
173     t.MI();
174     t.D(3);
175 }
176 
177 inline void rotateJ(MagicCube &t) {
178     t.L();
179     t.MK();
180     t.R(3);
181 }
182 
183 inline void rotateK(MagicCube &t) {
184     t.F();
185     t.MJ();
186     t.B(3);
187 }
188 
189 inline bool check(const MagicCube &tmp) {
190     MagicCube t = tmp;    
191     /*
192 
193     for (int i = 0; i < 4; ++i) {
194         for (int j = 0; j < 4; ++j) {
195             for (int k = 0; k < 4; ++k) {
196                 if (inHash(t.encode())) return false;
197                 rotateK(t);
198             }
199             rotateJ(t);
200         }
201         rotateI(t);
202     }
203     return true;
204 */
205     for (int j = 0; j < 4; ++j) {    
206         for (int i = 0; i < 4; ++i) {
207             if (inHash(t.encode())) return false;
208             rotateI(t);
209         }
210         rotateK(t);
211     }
212     rotateJ(t);
213     for (int i = 0; i < 4; ++i) {
214         if (inHash(t.encode())) return false;
215         rotateI(t);
216     }
217     rotateJ(t); rotateJ(t);
218     for (int i = 0; i < 4; ++i) {
219         if (inHash(t.encode())) return false;
220         rotateI(t);
221     }
222 
223     return true;
224 }
225 
226 
227 void solve() {
228     ans = 0;
229     while (q.size()) q.pop();
230     LL u = mc.encode();
231     for (int i = 0; i < MOD; ++i) hash[i].clear(); 
232     addHash(u); q.push(u);
233     MagicCube tmp;
234     LL key;
235     while (q.size()) {
236         u = q.front(); ++ans; q.pop();
237         tmp.decode(u);
238         for (int i = 1; i <= 4; ++i) {
239             tmp.L();
240             if (i == 4) break;
241             if (check(tmp)) {
242             key = tmp.encode();    
243                 addHash(key);
244                 q.push(key);
245             }
246         }
247         for (int i = 1; i <= 4; ++i) {
248             tmp.F();
249             if (i == 4) break;
250             if (check(tmp)) {
251             key = tmp.encode();    
252                 addHash(key);
253                 q.push(key);
254             }
255         }
256         for (int i = 1; i <= 4; ++i) {
257             tmp.U();
258             if (i == 4) break;
259             if (check(tmp)) {
260             key = tmp.encode();    
261                 addHash(key);
262                 q.push(key);
263             }
264         }
265         for (int i = 1; i <= 4; ++i) {
266             tmp.D();
267             if (i == 4) break;
268             if (check(tmp)) {
269             key = tmp.encode();    
270                 addHash(key);
271                 q.push(key);
272             }
273         }
274         for (int i = 1; i <= 4; ++i) {
275             tmp.R();
276             if (i == 4) break;
277             if (check(tmp)) {
278             key = tmp.encode();    
279                 addHash(key);
280                 q.push(key);
281             }
282         }
283         for (int i = 1; i <= 4; ++i) {
284             tmp.B();
285             if (i == 4) break;
286             if (check(tmp)) {
287             key = tmp.encode();    
288                 addHash(key);
289                 q.push(key);
290             }
291         }
292     }
293 }
294 
295 int main() {
296 
297     int cas; scanf("%d", &cas);
298     for (int tt = 1; tt <= cas; ++tt) {
299         memset(a, 0, sizeof(a));
300         scanf("%d", &n);
301         for (int i = 0; i < n; ++i) {
302             int x; scanf("%d",&x); a[x] = 1;
303         }
304         mc.init();
305         solve();
306         printf("Case #%d: %d\n", tt, ans);
307     }
308     return 0;
309 }
hdu5836

 

posted @ 2016-08-16 10:32  F.D.His.D  阅读(...)  评论(...编辑  收藏