题目描述
给定三阶魔方的基本操作:
现给出一个由基本操作组合成的操作序列,求问:对一个初状态(六个面都是拼好的)的魔方进行多少次连续的序列操作后,魔方会恢复到初状态。
解题思路
玩过魔方的童鞋应该都知道,一个魔方,如果按照一定的方法循环操作,最后这个魔方一定会恢复原状态。(蒟蒻不会证明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 }