題意:
問魔方在N步內,最多可以還原幾個面
思路:暴力
#include<bits/stdc++.h>
using namespace std;
int p[3][3][4]={
{{1,21,17,7},{8,9,15,14},{3,23,19,13}},
{{1,4,18,15},{23,22,20,21},{0,10,19,9}},
{{23,8,6,4},{0,1,3,2},{22,9,7,5}}
};
int a[25];
int maxx;
int judge()
{
int f=0;
if(a[0]==a[1]&&a[1]==a[2]&&a[2]==a[3]) f++;
if(a[4]==a[5]&&a[5]==a[10]&&a[10]==a[11]) f++;
if(a[6]==a[7]&&a[7]==a[12]&&a[12]==a[13]) f++;
if(a[8]==a[9]&&a[9]==a[14]&&a[14]==a[15]) f++;
if(a[16]==a[17]&&a[17]==a[18]&&a[18]==a[19]) f++;
if(a[20]==a[21]&&a[21]==a[22]&&a[22]==a[23]) f++;
return f;
}
void pdo(int k)
{
int b[4];
for(int i=0;i<3;i++)
{
b[0]=a[p[k][i][0]];
b[1]=a[p[k][i][1]];
b[2]=a[p[k][i][2]];
b[3]=a[p[k][i][3]];
a[p[k][i][0]]=b[3];
a[p[k][i][1]]=b[0];
a[p[k][i][2]]=b[1];
a[p[k][i][3]]=b[2];
}
}
void dfs(int n)
{
maxx=max(judge(),maxx);
if(maxx==6) return ;
if(n==0) return ;
for(int i=0;i<3;i++)
{
pdo(i);
dfs(n-1);
if(maxx==6) return ;
pdo(i);
pdo(i);
dfs(n-1);
if(maxx==6) return ;
pdo(i);
}
}
int main()
{
int T;
while(~scanf("%d",&T))
{
for(int i=0;i<24;i++)
scanf("%d",a+i);
maxx=0;
dfs(T);
printf("%d\n",maxx);
}
return 0;
}