链接:http://vjudge.net/contest/view.action?cid=51289#problem/K
题意:给一个小魔方(每面只有四个小块),每个小块有自己的颜色(一共六种颜色,每种颜色四块),问经过最多N次操作(N<=7),每次操作是将魔方某一面转动90度,最多能使多少个面的四个小块颜色都相同。
思路:每次操作产生6种状态,(向前,向后,向左,向右,向上,向下,左半魔方向前和右半魔方向后的操作产生的状态本质是一样的)直接BFS搜索,可能产生的状态一共有6^7种,中间比较麻烦的是状态的变化。
代码:
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <map>
#include <cstdlib>
#include <queue>
#include <stack>
#include <vector>
#include <ctype.h>
#include <algorithm>
#include <string>
#include <set>
#define PI acos(-1.0)
#define maxn 100005
#define INF 0x7fffffff
#define eps 1e-8
typedef long long LL;
typedef unsigned long long ULL;
using namespace std;
struct Matrix
{
int step;
int a[26];
}st,s1,s;
int n;
int BFS()
{
int ans=0;
queue <Matrix> q;
while(!q.empty())
q.pop();
q.push(st);
while(!q.empty())
{
s1=q.front();
int res=(s1.a[7]==s1.a[6]&&s1.a[7]==s1.a[13]&&s1.a[7]==s1.a[12])+
(s1.a[0]==s1.a[1]&&s1.a[0]==s1.a[2]&&s1.a[0]==s1.a[3])+
(s1.a[16]==s1.a[17]&&s1.a[16]==s1.a[18]&&s1.a[16]==s1.a[19])+
(s1.a[20]==s1.a[21]&&s1.a[20]==s1.a[22]&&s1.a[20]==s1.a[23])+
(s1.a[4]==s1.a[5]&&s1.a[4]==s1.a[10]&&s1.a[4]==s1.a[11])+
(s1.a[8]==s1.a[9]&&s1.a[8]==s1.a[14]&&s1.a[8]==s1.a[15]);
if(res>ans)
{
ans=res;
if(ans==6)
return ans;
}
q.pop();
if(s1.step<n)
{
int a,b;
s=s1;a=s.a[1];b=s.a[3];
s.a[1]=s.a[7];s.a[3]=s.a[13];s.a[7]=s.a[17];s.a[13]=s.a[19];
s.a[17]=s.a[21];s.a[19]=s.a[23];s.a[21]=a;s.a[23]=b;
a=s.a[9];
s.a[9]=s.a[8];s.a[8]=s.a[14];s.a[14]=s.a[15];s.a[15]=a;
s.step=s1.step+1;
q.push(s);
s=s1;a=s.a[1];b=s.a[3];
s.a[1]=s.a[21];s.a[3]=s.a[23];s.a[21]=s.a[17];s.a[23]=s.a[19];
s.a[17]=s.a[7];s.a[19]=s.a[13];s.a[7]=a;s.a[13]=b;
a=s.a[8];
s.a[8]=s.a[9];s.a[9]=s.a[15];s.a[15]=s.a[14];s.a[14]=a;
s.step=s1.step+1;
q.push(s);
s=s1;a=s.a[6];b=s.a[7];
s.a[6]=s.a[8];s.a[7]=s.a[9];s.a[8]=s.a[23];s.a[9]=s.a[22];
s.a[23]=s.a[4];s.a[22]=s.a[5];s.a[4]=a;s.a[5]=b;
a=s.a[0];
s.a[0]=s.a[2];s.a[2]=s.a[3];s.a[3]=s.a[1];s.a[1]=a;
s.step=s1.step+1;
q.push(s);
s=s1;a=s.a[6];b=s.a[7];
s.a[6]=s.a[4];s.a[7]=s.a[5];s.a[4]=s.a[23];s.a[5]=s.a[22];
s.a[23]=s.a[8];s.a[22]=s.a[9];s.a[8]=a;s.a[9]=b;
a=s.a[0];
s.a[0]=s.a[1];s.a[1]=s.a[3];s.a[3]=s.a[2];s.a[2]=a;
s.step=s1.step+1;
q.push(s);
s=s1;a=s.a[3];b=s.a[2];
s.a[3]=s.a[5];s.a[2]=s.a[11];s.a[5]=s.a[16];s.a[11]=s.a[17];
s.a[16]=s.a[14];s.a[17]=s.a[8];s.a[14]=a;s.a[8]=b;
a=s.a[6];
s.a[6]=s.a[12];s.a[12]=s.a[13];s.a[13]=s.a[7];s.a[7]=a;
s.step=s1.step+1;
q.push(s);
s=s1;a=s.a[3];b=s.a[2];
s.a[3]=s.a[14];s.a[2]=s.a[8];s.a[14]=s.a[16];s.a[8]=s.a[17];
s.a[16]=s.a[5];s.a[17]=s.a[11];s.a[5]=a;s.a[11]=b;
a=s.a[6];
s.a[6]=s.a[7];s.a[7]=s.a[13];s.a[13]=s.a[12];s.a[12]=a;
s.step=s1.step+1;
q.push(s);
}
}
return ans;
}
int main()
{
while(~scanf("%d",&n))
{
for(int i=0;i<24;i++)
scanf("%d",&st.a[i]);
st.step=0;
int a=BFS();
printf("%d\n",a);
}
return 0;
}