题意:有一个2×2×2的魔方,每一个小块上的颜色都不同,你现在最多能转魔方n次,m为魔方中一个面上的颜色全都相同的面的个数,问能转到的状态中m的最大值是多少。
思路:思路很简单,直接搜完所有状态,然后取个最大值就行了,但是写起来很烦,转啊转的都蒙了,gyf没事用纸做了个魔方给我看,按着这个魔方费了半天劲打了表……首先随便选一个面作为正面,那么对于当前状态来说一共有6种转法(怎么转的很容易能想出来),然后把转完以后哪个面对应哪个面算出来,打个表,剩下没什么难度,根据表直接搞就行了……
代码:
#include<iostream> #include<cstdio> #include<cstring> #include<string> #include<algorithm> #include<map> #include<queue> #include<set> #include<stack> #include<cmath> #include<vector> #define inf 0x3f3f3f3f #define Inf 0x3FFFFFFFFFFFFFFFLL #define eps 1e-9 #define pi acos(-1.0) using namespace std; typedef long long ll; int n,ans; int now[30],b[30]; int convert[6][24]= { {1,3,0,2,23,22,4,5,6,7,10,11,12,13,14,15,16,17,18,19,20,21,9,8}, {2,0,3,1,6,7,8,9,23,22,10,11,12,13,14,15,16,17,18,19,20,21,5,4}, {0,7,2,13,4,5,6,17,14,8,10,11,12,19,15,9,16,21,18,23,20,1,22,3}, {0,21,2,23,4,5,6,1,9,15,10,11,12,3,8,14,16,7,18,13,20,17,22,19}, {0,1,8,14,4,3,7,13,17,9,10,2,6,12,16,15,5,11,18,19,20,21,22,23}, {0,1,11,5,4,16,12,6,2,9,10,17,13,7,3,15,14,8,18,19,20,21,22,23} }; int check() { int rnt=0; bool flag=true; int color=now[0]; for(int i=0;i<4;++i) if(now[i]!=color) flag=false; if(flag) rnt++; color=now[16]; flag=true; for(int i=16;i<20;++i) if(now[i]!=color) flag=false; if(flag) rnt++; color=now[20]; flag=true; for(int i=20;i<24;++i) if(now[i]!=color) flag=false; if(flag) rnt++; color=now[4]; flag=true; for(int i=0;i<2;++i) if(now[4+i]!=color||now[4+i+6]!=color) flag=false; if(flag) rnt++; color=now[6]; flag=true; for(int i=0;i<2;++i) if(now[6+i]!=color||now[6+i+6]!=color) flag=false; if(flag) rnt++; color=now[8]; flag=true; for(int i=0;i<2;++i) if(now[8+i]!=color||now[8+i+6]!=color) flag=false; if(flag) rnt++; return rnt; } void rotate(int wh) { for(int i=0;i<24;++i) b[i]=now[convert[wh][i]]; for(int i=0;i<24;++i) now[i]=b[i]; } void dfs(int step) { if(step==n) return ; for(int i=0;i<6;++i) { rotate(i); int tmp=check(); ans=max(ans,tmp); dfs(step+1); rotate(i^1); } } int main() { //freopen("in.txt","r",stdin); //freopen("out.txt","w",stdout); while(~scanf("%d",&n)) { for(int i=0;i<24;++i) scanf("%d",&now[i]); ans=check(); dfs(0); printf("%d\n",ans); } return 0; }