传送门:点击打开链接
题意:给出一个魔方,每个数字代表一种颜色,可以将每个面顺(逆)时针翻转九十度,问是否能让魔方的每个面颜色都相同。
分析:乍一看就是个模拟,总共有6种翻转情况,将每次翻转的情况进行判断就行了,结果写了很久的代码,代码有两百多行,精简之后还有一百多行,看来下别人的代码,代码很精简,只有几十行,学到了,后面发现并不需要代码去模拟翻转,手动模拟一下,直接判断6种情况下6个面的颜色是否一致就行了,代码要少很多,平时思维训练太少了,还是要多打cf。另外需要注意一个,将数组作为形参,传入的是地址,改变参数数组,原数组也会跟着改变,这是需要在函数内部加开一个数组复制数值,害得我改了很久的bug,基础不扎实啊。
代码一:
#include<bits/stdc++.h> using namespace std ; const int maxn = 10000 + 20 ; typedef long long ll; int a[25],b[25],fg; int ok( int b[] ){ int f = 1; for(int i=1; i<24; i+=4) if( !(b[i] == b[i+1] && b[i+1] == b[i+2] && b[i+2] == b[i+3]) ) f=0; return f; } void turn1() { memcpy(b,a,sizeof(b)); int tp = b[1]; b[1] = b[5]; b[5] = b[9]; b[9] = b[24]; b[24] = tp; tp = b[3]; b[3] = b[7]; b[7] = b[11]; b[11] = b[22]; b[22] = tp; if( ok(b) ) fg=1; } void turn2( ) { memcpy(b,a,sizeof(b)); int tp = b[24]; b[24] = b[9]; b[9] = b[5]; b[5] = b[1]; b[1] = tp; tp = b[22]; b[22] = b[11]; b[11] = b[7]; b[7] = b[3]; b[3] = tp; if( ok(b) ) fg=1; } void turn3( ) { memcpy(b,a,sizeof(b)); int tp = b[13]; b[13] = b[5]; b[5] = b[17]; b[17] = b[21]; b[21] = tp; tp = b[14]; b[14] = b[6]; b[6] = b[18]; b[18] = b[22]; b[22] = tp; if( ok(b) ) fg=1; } void turn4( ) { memcpy(b,a,sizeof(b)); int tp = b[21]; b[21] = b[17]; b[17] = b[5]; b[5] = b[13]; b[13] = tp; tp = b[22]; b[22] = b[18]; b[18] = b[6]; b[6] = b[14]; b[14] = tp; if( ok(b) ) fg=1; } void turn5( ) { memcpy(b,a,sizeof(b)); int tp = b[4]; b[4] = b[14]; b[14] = b[9]; b[9] = b[19]; b[19] = tp; tp = b[3]; b[3] = b[16]; b[16] = b[10]; b[10] = b[17]; b[17] = tp; if( ok(b) ) fg=1; } void turn6( ) { memcpy(b,a,sizeof(b)); int tp = b[19]; b[19] = b[9]; b[9] = b[14]; b[14] = b[4]; b[4] = tp; tp = b[17]; b[17] = b[10]; b[10] = b[16]; b[16] = b[3]; b[3] = tp; if( ok(b) ) fg=1; } int main() { for( int i = 1; i <= 24; i ++ ) cin >> a[i]; turn1(); turn2(); turn3(); turn4(); turn5(); turn6(); if( fg ) cout << "YES" << endl; else cout << "NO" << endl; return 0 ; }
代码二:
#include<bits/stdc++.h> using namespace std ; const int maxn = 10000 + 20 ; typedef long long ll; int a[25],b[25],f=1,fg=0; int c[3][8]={ {1,3,5,7,9,11,24,22}, {5,6,17,18,21,22,13,14}, {3,4,17,19,10,9,16,14} }; void ok(){ f=1; for(int i=1; i<24; i+=4) for(int j=1;j<=3;j++) if(b[i+j]!=b[i]) f=0; } void turn(int x,int d) { memcpy(b,a,sizeof(b)); for(int i=0;i<8;i++) b[c[x][i]]=a[c[x][(i+d+8)%8]]; ok(); if(f) fg=1; } void sv() { for(int i=0;i<3;i++) { turn(i,2); turn(i,-2); } if(fg) cout << "YES" << endl; else cout << "NO" << endl; } int main() { for( int i = 1; i <= 24; i ++ ) cin >> a[i]; sv(); }
代码三:
#include<bits/stdc++.h> using namespace std ; int a[25]; int ok(int i,int j,int k,int l){ if(a[i]==a[j] && a[j]==a[k] && a[k]==a[l]) return 1; return 0; } void sv() { int f=0; if( ok(13,14,15,16) && ok(17,18,19,20) && ok(1,3,21,23) && ok(2,4,5,7) && ok(6,8,9,11) && ok(10,12,22,24)) f=1; else if( ok(13,14,15,16) && ok(17,18,19,20) && ok(1,3,6,8) && ok(5,7,10,12) && ok(9,11,21,23) && ok(2,4,22,24) ) f=1; else if( ok(1,2,3,4) && ok(9,10,11,12) && ok(5,6,19,20) && ok(17,18,23,24) && ok(15,16,21,22) && ok(7,8,13,14) ) f=1; else if( ok(1,2,3,4) && ok(9,10,11,12) && ok(5,6,15,16) && ok(7,8,17,18) && ok(19,20,21,22) && ok(13,14,23,24) ) f=1; else if( ok(5,6,7,8) && ok(21,22,23,24) && ok(3,4,13,15) && ok(11,12,14,16) && ok(9,10,18,20) && ok(1,2,17,19) ) f=1; else if( ok(5,6,7,8) && ok(21,22,23,24) && ok(1,2,14,16) && ok(9,10,13,15) && ok(11,12,17,19) && ok(3,4,18,20) ) f=1; if( f ) cout << "YES" << endl; else cout << "NO" << endl; } int main() { for( int i = 1; i <= 24; i ++ ) cin >> a[i]; sv(); return 0 ; }