题意:给你一个2*2的魔方,给你每个面每个小块的颜色,一共24个,然后问你能否在一步之内还原.
题解:手动在纸上画,推出每种变化对应的置换,显然,一共有6种,而且可以当成3种,(具体哪3种,就是绕x,y,z轴转一次的),另外一个方向,就是转三次就行了
而且你也不需要考虑什么上面转了下面转,相对关系是一样的
写的时候犯了个错,手写的u,v,r分不清楚了.....
转一次会有12个小面发生变化,写的时候可以只写8个面,因为有一个面的位置变了,
但是我们只问一步之内能不能还原,那一面的都没有到其他面,所以不影响也就是我注释部分,
记得一进来就判这个魔方是不是已经是还原好的.
1 #include<bits/stdc++.h> 2 using namespace std; 3 int T,f,a[25],b[25],x[25]; 4 int ok() 5 { 6 for (int i=2;i<=4;i++) if (x[i]!=x[1]) return 0; 7 for (int i=6;i<=8;i++) if (x[i]!=x[5]) return 0; 8 for (int i=10;i<=12;i++) if (x[i]!=x[9]) return 0; 9 for (int i=14;i<=16;i++) if (x[i]!=x[13]) return 0; 10 for (int i=18;i<=20;i++) if (x[i]!=x[17]) return 0; 11 for (int i=22;i<=24;i++) if (x[i]!=x[21]) return 0; 12 return 1; 13 } 14 int okk() 15 { 16 for (int i=2;i<=4;i++) if (b[i]!=b[1]) return 0; 17 for (int i=6;i<=8;i++) if (b[i]!=b[5]) return 0; 18 for (int i=10;i<=12;i++) if (b[i]!=b[9]) return 0; 19 for (int i=14;i<=16;i++) if (b[i]!=b[13]) return 0; 20 for (int i=18;i<=20;i++) if (b[i]!=b[17]) return 0; 21 for (int i=22;i<=24;i++) if (b[i]!=b[21]) return 0; 22 return 1; 23 } 24 void z1() 25 { 26 /*x[2]=a[1]; 27 x[4]=a[2]; 28 x[1]=a[3]; 29 x[3]=a[4];*/ 30 x[20]=a[6]; 31 x[18]=a[5]; 32 x[5]=a[23]; 33 x[6]=a[21]; 34 x[21]=a[15]; 35 x[23]=a[16]; 36 x[16]=a[18]; 37 x[15]=a[20]; 38 } 39 void z2() 40 { 41 /*x[21]=a[23]; 42 x[23]=a[24]; 43 x[22]=a[21]; 44 x[24]=a[22];*/ 45 x[14]=a[2]; 46 x[16]=a[4]; 47 x[10]=a[14]; 48 x[12]=a[16]; 49 x[2]=a[6]; 50 x[4]=a[8]; 51 x[8]=a[12]; 52 x[6]=a[10]; 53 } 54 void z3() 55 { 56 /*x[5]=a[6]; 57 x[6]=a[8]; 58 x[7]=a[5]; 59 x[8]=a[7];*/ 60 x[20]=a[4]; 61 x[19]=a[3]; 62 x[9]=a[20]; 63 x[10]=a[19]; 64 x[3]=a[23]; 65 x[4]=a[24]; 66 x[24]=a[9]; 67 x[23]=a[10]; 68 } 69 int ok1() 70 { 71 for (int i=1;i<=24;i++) a[i]=b[i]; 72 for (int i=1;i<=24;i++) x[i]=a[i]; 73 z1(); 74 if (ok()) return 1; 75 for (int i=1;i<=24;i++) a[i]=x[i]; 76 z1(); 77 for (int i=1;i<=24;i++) a[i]=x[i]; 78 z1(); 79 if (ok()) return 1; 80 return 0; 81 } 82 int ok2() 83 { 84 for (int i=1;i<=24;i++) a[i]=b[i]; 85 for (int i=1;i<=24;i++) x[i]=a[i]; 86 z2(); 87 if (ok()) return 1; 88 for (int i=1;i<=24;i++) a[i]=x[i]; 89 z2(); 90 for (int i=1;i<=24;i++) a[i]=x[i]; 91 z2(); 92 if (ok()) return 1; 93 return 0; 94 } 95 int ok3() 96 { 97 for (int i=1;i<=24;i++) a[i]=b[i]; 98 for (int i=1;i<=24;i++) x[i]=a[i]; 99 z3(); 100 if (ok()) return 1; 101 for (int i=1;i<=24;i++) a[i]=x[i]; 102 z3(); 103 for (int i=1;i<=24;i++) a[i]=x[i]; 104 z3(); 105 if (ok()) return 1; 106 return 0; 107 } 108 int main() 109 { 110 scanf("%d",&T); 111 while (T--) 112 { 113 f=0; 114 for (int i=1;i<=24;i++) scanf("%d",&b[i]); 115 if (okk()) f=1; 116 if (f==0) if (ok1()) f=1; 117 if (f==0) if (ok2()) f=1; 118 if (f==0) if (ok3()) f=1; 119 if (f==1) puts("YES");else puts("NO"); 120 } 121 return 0; 122 }
原文地址:https://www.cnblogs.com/qywhy/p/9741068.html
时间: 2024-10-08 09:20:59