题意:给出一个魔方的状态,求出在n次转动内最多可以成功多少个面。
思路:现场赛时,wx翻译完题目我们就知道是深搜,wx说只需要转三个面。复杂度就是(2*3)^7.当时我想着可以优化一下,一个面沿一个方向转一次后,就不要沿另一个方向转,复杂度降到6*5^6,不优化时间跑了500ms多,优化一下156ms,,
#include
#include
int mian[6][4]={0,1,2,3,16,17,18,19,4,5,10,11,8,9,14,15,6,7,12,13,20,21,22,23};//六个面的编号
int huan[3][12],color[24],ans,n;
int max(int a,int b)
{
if(a>b)return a;
return b;
}
void insit()
{
//转动的三个面的编号(顺时针)
huan[0][0]=6;huan[0][1]=7;huan[0][2]=13;huan[0][3]=12;
huan[1][0]=16;huan[1][1]=17;huan[1][2]=19;huan[1][3]=18;
huan[2][0]=14;huan[2][1]=8;huan[2][2]=9;huan[2][3]=15;
//转动时面的侧面的编号
huan[0][4]=2;huan[0][5]=3;huan[0][6]=8;huan[0][7]=14;huan[0][8]=17;huan[0][9]=16;huan[0][10]=11;huan[0][11]=5;
huan[1][4]=10;huan[1][5]=11;huan[1][6]=12;huan[1][7]=13;huan[1][8]=14;huan[1][9]=15;huan[1][10]=21;huan[1][11]=20;
huan[2][4]=23;huan[2][5]=21;huan[2][6]=19;huan[2][7]=17;huan[2][8]=13;huan[2][9]=7;huan[2][10]=3;huan[2][11]=1;
}
void move1(int id)//顺时针转动
{
int i,tt,t=color[huan[id][3]];
for(i=3;i>0;i--)
color[huan[id][i]]=color[huan[id][i-1]];
color[huan[id][0]]=t;
t=color[huan[id][10]];tt=color[huan[id][11]];
for(i=11;i>5;i--)
color[huan[id][i]]=color[huan[id][i-2]];
color[huan[id][4]]=t;color[huan[id][5]]=tt;
}
void move2(int id)//逆时针转动
{
int i,tt,t=color[huan[id][0]];
for(i=0;i<3;i++)
color[huan[id][i]]=color[huan[id][i+1]];
color[huan[id][3]]=t;
t=color[huan[id][4]];tt=color[huan[id][5]];
for(i=4;i<10;i++)
color[huan[id][i]]=color[huan[id][i+2]];
color[huan[id][10]]=t;color[huan[id][11]]=tt;
}
void move(int id,int i)
{
if(id==0)move1(i);
else if(id==1)move2(i);
}
int judge()
{
int i,j,k=0;
for(i=0;i<6;i++)
{
for(j=1;j<4;j++)
if(color[mian[i][j]]!=color[mian[i][0]])break;
if(j==4)k++;
}
return k;
}
void dfs(int num,int ii,int id)
{
if(num>=n||ans==6)return ;
for(int i=0;i<3;i++)
{
if(i==ii)
{
move(id,i);
ans=max(judge(),ans);
dfs(num+1,i,id);
move(id^1,i);
continue;
}
for(int j=0;j<2;j++)
{
move(j,i);
ans=max(judge(),ans);
dfs(num+1,i,j);
move(j^1,i);
}
}
}
int main()
{
int i;
insit();
while(scanf("%d",&n)!=-1)
{
for(i=0;i<24;i++)
scanf("%d",&color[i]);
ans=judge();
dfs(0,-1,-1);
printf("%d\n",ans);
}
return 0;
}