【HDU 5250】三阶魔方

传送门戳这里

题目描述

给定三阶魔方的基本操作:

现给出一个由基本操作组合成的操作序列,求问:对一个初状态(六个面都是拼好的)的魔方进行多少次连续的序列操作后,魔方会恢复到初状态。

解题思路

玩过魔方的童鞋应该都知道,一个魔方,如果按照一定的方法循环操作,最后这个魔方一定会恢复原状态。(蒟蒻不会证明qwq)

另外,对于一个魔方,假设魔方的面上没有颜色,取而代之的一个个坐标,那么,经过一次操作,如果一个坐标位置的面转移到弄一个位置的面上,那么不论这个面上是什么颜色,都会从这里转到那了,那么,一次操作后所有面的一次的转移位置都已经确定了,比如面a转移到面b的位置,面b转移到面c的位置,面c转移到面d的位置,面d转移到面a的位置,那么,这能说明什么呢?

显然,a,b,c,d,构成了一个四元环,那么,a,b,c,d这四个面都要经过4的倍数次操作才能保证位置回到初始位置,对吧?

那么,就是令人头疼的模拟了。

代码(可能是全网最丑)

  1 #include<iostream>
  2 #include<cstdio>
  3 #include<cstring>
  4 #include<algorithm>
  5 using namespace std;
  6 int T,cube[7][5][5],last[7][5][5],cnt=0;;
  7 bool vis[500];
  8 int loo[500];
  9 inline void ini(){
 10     memset(cube,0,sizeof(cube));
 11     int cnt=0;
 12     for(register int face=1;face<=6;face++){
 13         for(register int i=1;i<=3;i++){
 14             for(register int j=1;j<=3;j++){
 15                 cube[face][i][j]=++cnt;
 16             }
 17         }
 18     }
 19 }
 20 inline void w(int c[7][5][5],int ID){
 21     int temp[4][4];
 22     for(register int i=1;i<=3;i++){
 23         for(register int j=1;j<=3;j++){
 24             temp[i][j]=c[ID][i][j];
 25         }
 26     }
 27     for(register int i=1;i<=3;i++){
 28         for(register int j=1;j<=3;j++){
 29             c[ID][i][j]=temp[4-j][i];
 30         }
 31     }
 32 }
 33 inline void a(int c[7][5][5],int ID){
 34     int temp[4][4];
 35     for(register int i=1;i<=3;i++){
 36         for(register int j=1;j<=3;j++){
 37             temp[i][j]=c[ID][i][j];
 38         }
 39     }
 40     for(register int i=1;i<=3;i++){
 41         for(register int j=1;j<=3;j++){
 42             c[ID][i][j]=temp[j][4-i];
 43         }
 44     }
 45 }
 46 inline void up_wise(){
 47     w(cube,2);
 48     int temp[7][5][5];
 49     memcpy(temp,cube,sizeof(cube));
 50     cube[3][1][1]=temp[1][1][1];
 51     cube[3][1][2]=temp[1][1][2];
 52     cube[3][1][3]=temp[1][1][3];
 53     cube[6][1][1]=temp[3][1][1];
 54     cube[6][1][2]=temp[3][1][2];
 55     cube[6][1][3]=temp[3][1][3];
 56     cube[5][1][1]=temp[6][1][1];
 57     cube[5][1][2]=temp[6][1][2];
 58     cube[5][1][3]=temp[6][1][3];
 59     cube[1][1][1]=temp[5][1][1];
 60     cube[1][1][2]=temp[5][1][2];
 61     cube[1][1][3]=temp[5][1][3];
 62 }
 63 inline void up_anti(){
 64     a(cube,2);
 65     int temp[7][5][5];
 66     memcpy(temp,cube,sizeof(cube));
 67     cube[1][1][1]=temp[3][1][1];
 68     cube[1][1][2]=temp[3][1][2];
 69     cube[1][1][3]=temp[3][1][3];
 70     cube[3][1][1]=temp[6][1][1];
 71     cube[3][1][2]=temp[6][1][2];
 72     cube[3][1][3]=temp[6][1][3];
 73     cube[6][1][1]=temp[5][1][1];
 74     cube[6][1][2]=temp[5][1][2];
 75     cube[6][1][3]=temp[5][1][3];
 76     cube[5][1][1]=temp[1][1][1];
 77     cube[5][1][2]=temp[1][1][2];
 78     cube[5][1][3]=temp[1][1][3];
 79 }
 80 inline void down_wise(){
 81     w(cube,4);
 82     int temp[7][5][5];
 83     memcpy(temp,cube,sizeof(cube));
 84     cube[1][3][1]=temp[3][3][1];
 85     cube[1][3][2]=temp[3][3][2];
 86     cube[1][3][3]=temp[3][3][3];
 87     cube[3][3][1]=temp[6][3][1];
 88     cube[3][3][2]=temp[6][3][2];
 89     cube[3][3][3]=temp[6][3][3];
 90     cube[6][3][1]=temp[5][3][1];
 91     cube[6][3][2]=temp[5][3][2];
 92     cube[6][3][3]=temp[5][3][3];
 93     cube[5][3][1]=temp[1][3][1];
 94     cube[5][3][2]=temp[1][3][2];
 95     cube[5][3][3]=temp[1][3][3];
 96 }
 97 inline void down_anti(){
 98     a(cube,4);
 99     int temp[7][5][5];
100     memcpy(temp,cube,sizeof(cube));
101     cube[3][3][1]=temp[1][3][1];
102     cube[3][3][2]=temp[1][3][2];
103     cube[3][3][3]=temp[1][3][3];
104     cube[6][3][1]=temp[3][3][1];
105     cube[6][3][2]=temp[3][3][2];
106     cube[6][3][3]=temp[3][3][3];
107     cube[5][3][1]=temp[6][3][1];
108     cube[5][3][2]=temp[6][3][2];
109     cube[5][3][3]=temp[6][3][3];
110     cube[1][3][1]=temp[5][3][1];
111     cube[1][3][2]=temp[5][3][2];
112     cube[1][3][3]=temp[5][3][3];
113 }
114 inline void front_wise(){
115     w(cube,1);
116     int temp[7][5][5];
117     memcpy(temp,cube,sizeof(cube));
118     cube[5][1][1]=temp[2][3][1];
119     cube[5][2][1]=temp[2][3][2];
120     cube[5][3][1]=temp[2][3][3];
121     cube[4][1][3]=temp[5][1][1];
122     cube[4][1][2]=temp[5][2][1];
123     cube[4][1][1]=temp[5][3][1];
124     cube[3][3][3]=temp[4][1][3];
125     cube[3][2][3]=temp[4][1][2];
126     cube[3][1][3]=temp[4][1][1];
127     cube[2][3][1]=temp[3][3][3];
128     cube[2][3][2]=temp[3][2][3];
129     cube[2][3][3]=temp[3][1][3];
130 }
131 inline void front_anti(){
132     a(cube,1);
133     int temp[7][5][5];
134     memcpy(temp,cube,sizeof(cube));
135     cube[2][3][1]=temp[5][1][1];
136     cube[2][3][2]=temp[5][2][1];
137     cube[2][3][3]=temp[5][3][1];
138     cube[5][1][1]=temp[4][1][3];
139     cube[5][2][1]=temp[4][1][2];
140     cube[5][3][1]=temp[4][1][1];
141     cube[4][1][3]=temp[3][3][3];
142     cube[4][1][2]=temp[3][2][3];
143     cube[4][1][1]=temp[3][1][3];
144     cube[3][3][3]=temp[2][3][1];
145     cube[3][2][3]=temp[2][3][2];
146     cube[3][1][3]=temp[2][3][3];
147 }
148 inline void back_wise(){
149     w(cube,6);
150     int temp[7][5][5];
151     memcpy(temp,cube,sizeof(cube));
152     cube[2][1][1]=temp[5][1][3];
153     cube[2][1][2]=temp[5][2][3];
154     cube[2][1][3]=temp[5][3][3];
155     cube[5][1][3]=temp[4][3][3];
156     cube[5][2][3]=temp[4][3][2];
157     cube[5][3][3]=temp[4][3][1];
158     cube[4][3][3]=temp[3][3][1];
159     cube[4][3][2]=temp[3][2][1];
160     cube[4][3][1]=temp[3][1][1];
161     cube[3][3][1]=temp[2][1][1];
162     cube[3][2][1]=temp[2][1][2];
163     cube[3][1][1]=temp[2][1][3];
164 }
165 inline void back_anti(){
166     a(cube,6);
167     int temp[7][5][5];
168     memcpy(temp,cube,sizeof(cube));
169     cube[5][1][3]=temp[2][1][1];
170     cube[5][2][3]=temp[2][1][2];
171     cube[5][3][3]=temp[2][1][3];
172     cube[4][3][3]=temp[5][1][3];
173     cube[4][3][2]=temp[5][2][3];
174     cube[4][3][1]=temp[5][3][3];
175     cube[3][3][1]=temp[4][3][3];
176     cube[3][2][1]=temp[4][3][2];
177     cube[3][1][1]=temp[4][3][1];
178     cube[2][1][1]=temp[3][3][1];
179     cube[2][1][2]=temp[3][2][1];
180     cube[2][1][3]=temp[3][1][1];
181 }
182 inline void left_wise(){
183     w(cube,3);
184     int temp[7][5][5];
185     memcpy(temp,cube,sizeof(cube));
186     cube[1][1][1]=temp[2][1][1];
187     cube[1][2][1]=temp[2][2][1];
188     cube[1][3][1]=temp[2][3][1];
189     cube[4][1][1]=temp[1][1][1];
190     cube[4][2][1]=temp[1][2][1];
191     cube[4][3][1]=temp[1][3][1];
192     cube[6][1][3]=temp[4][3][1];
193     cube[6][2][3]=temp[4][2][1];
194     cube[6][3][3]=temp[4][1][1];
195     cube[2][3][1]=temp[6][1][3];
196     cube[2][2][1]=temp[6][2][3];
197     cube[2][1][1]=temp[6][3][3];
198 }
199 inline void left_anti(){
200     a(cube,3);
201     int temp[7][5][5];
202     memcpy(temp,cube,sizeof(cube));
203     cube[2][1][1]=temp[1][1][1];
204     cube[2][2][1]=temp[1][2][1];
205     cube[2][3][1]=temp[1][3][1];
206     cube[1][1][1]=temp[4][1][1];
207     cube[1][2][1]=temp[4][2][1];
208     cube[1][3][1]=temp[4][3][1];
209     cube[4][3][1]=temp[6][1][3];
210     cube[4][2][1]=temp[6][2][3];
211     cube[4][1][1]=temp[6][3][3];
212     cube[6][1][3]=temp[2][3][1];
213     cube[6][2][3]=temp[2][2][1];
214     cube[6][3][3]=temp[2][1][1];
215 }
216 inline void right_wise(){
217     w(cube,5);
218     int temp[7][5][5];
219     memcpy(temp,cube,sizeof(cube));
220     cube[2][1][3]=temp[1][1][3];
221     cube[2][2][3]=temp[1][2][3];
222     cube[2][3][3]=temp[1][3][3];
223     cube[1][1][3]=temp[4][1][3];
224     cube[1][2][3]=temp[4][2][3];
225     cube[1][3][3]=temp[4][3][3];
226     cube[6][3][1]=temp[2][1][3];
227     cube[6][2][1]=temp[2][2][3];
228     cube[6][1][1]=temp[2][3][3];
229     cube[4][3][3]=temp[6][1][1];
230     cube[4][2][3]=temp[6][2][1];
231     cube[4][1][3]=temp[6][3][1];
232 }
233 inline void right_anti(){
234     a(cube,5);
235     int temp[7][5][5];
236     memcpy(temp,cube,sizeof(cube));
237     cube[1][1][3]=temp[2][1][3];
238     cube[1][2][3]=temp[2][2][3];
239     cube[1][3][3]=temp[2][3][3];
240     cube[4][1][3]=temp[1][1][3];
241     cube[4][2][3]=temp[1][2][3];
242     cube[4][3][3]=temp[1][3][3];
243     cube[2][1][3]=temp[6][3][1];
244     cube[2][2][3]=temp[6][2][1];
245     cube[2][3][3]=temp[6][1][1];
246     cube[6][1][1]=temp[4][3][3];
247     cube[6][2][1]=temp[4][2][3];
248     cube[6][3][1]=temp[4][1][3];
249 }
250 inline int dfs(int f,int x,int y,int dep){
251     int num=cube[f][x][y];
252     if(vis[num])return dep;
253     vis[num]=1;
254     for(register int F=1;F<=6;F++){
255         for(register int i=1;i<=3;i++){
256             for(register int j=1;j<=3;j++){
257                 if(last[F][i][j]==num){
258                     return dfs(F,i,j,dep+1);
259                 }
260             }
261         }
262     }
263 }
264 inline int gcd(int x,int y){
265     return x==0?y:gcd(y%x,x);
266 }
267 int main(){
268     cin>>T;
269     for(register int t=1;t<=T;t++){
270         char s[500];
271         scanf("%s",s);
272         ini();
273         int size=strlen(s);
274         for(register int i=0;i<size;){
275             if(s[i]=='U'){
276                 if(s[i+1]=='\''){
277                     up_anti();
278                     i++;
279                 }
280                 else if(s[i+1]=='2'){
281                     up_wise(),up_wise();
282                     i++;
283                 }
284                 else up_wise();
285                 i++;
286             }
287             if(s[i]=='R'){
288                 if(s[i+1]=='\''){
289                     right_anti();
290                     i++;
291                 }
292                 else if(s[i+1]=='2'){
293                     right_wise(),right_wise();
294                     i++;
295                 }
296                 else right_wise();
297                 i++;
298             }
299             if(s[i]=='F'){
300                 if(s[i+1]=='\''){
301                     front_anti();
302                     i++;
303                 }
304                 else if(s[i+1]=='2'){
305                     front_wise(),front_wise();
306                     i++;
307                 }
308                 else front_wise();
309                 i++;
310             }
311             if(s[i]=='D'){
312                 if(s[i+1]=='\''){
313                     down_anti();
314                     i++;
315                 }
316                 else if(s[i+1]=='2'){
317                     down_wise(),down_wise();
318                     i++;
319                 }
320                 else down_wise();
321                 i++;
322             }
323             if(s[i]=='L'){
324                 if(s[i+1]=='\''){
325                     left_anti();
326                     i++;
327                 }
328                 else if(s[i+1]=='2'){
329                     left_wise(),left_wise();
330                     i++;
331                 }
332                 else left_wise();
333                 i++;
334             }
335             if(s[i]=='B'){
336                 if(s[i+1]=='\''){
337                     back_anti();
338                     i++;
339                 }
340                 else if(s[i+1]=='2'){
341                     back_wise(),back_wise();
342                     i++;
343                 }
344                 else back_wise();
345                 i++;
346             }
347         }
348         memcpy(last,cube,sizeof(cube));
349         memset(vis,0,sizeof(vis));
350         memset(loo,0,sizeof(loo));
351         ini();
352         cnt=0;
353         for(register int F=1;F<=6;F++){
354             for(register int i=1;i<=3;i++){
355                 for(register int j=1;j<=3;j++){
356                     int num=dfs(F,i,j,0);
357                     if(num){
358                         loo[++cnt]=num;
359                     }
360                 }
361             }
362         }
363         long long ans=1;
364         for(register int i=1;i<=cnt;i++){
365             ans=ans/gcd(ans,(long long)loo[i])*loo[i];
366         }
367         printf("Case #%d:\n",t);
368         printf("%lld\n",ans);
369     }
370 }

猜你喜欢

转载自www.cnblogs.com/Fang-Hao/p/9113132.html