zoj 3726 Pocket Cube(搜索)

来源:互联网 发布:mac os sierra beta4 编辑:程序博客网 时间:2024/04/18 13:05

题意:有一个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;}


原创粉丝点击