//
// main.cpp
// Richard
//
// Created by 邵金杰 on 16/8/27.
// Copyright © 2016年 邵金杰. All rights reserved.
//
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int a[30];
int pos[8]={7,8,9,12,13,16,17,18};
int depth;
char out[100];
int ans;
bool isok(int *p)
{
int k=p[7];
return k==p[8]&&k==p[9]&&k==p[12]&&k==p[13]&&k==p[16]&&k==p[17]&&k==p[18];
}
int count(int *p)
{
int c[4];
c[1]=c[2]=c[3]=0;
for(int i=0;i<8;i++){
int k=pos[i];
c[p[k]]++;
}
return max(c[1],max(c[2],c[3]));
}
void rotate(int *p,int p1,int p2,int p3,int p4,int p5,int p6,int p7)
{
int temp=p[p1];
p[p1]=p[p2];p[p2]=p[p3];p[p3]=p[p4];p[p4]=p[p5];p[p5]=p[p6];p[p6]=p[p7];
p[p7]=temp;
}
//剪枝
bool repeat(int k1,int k2)
{
if(k1>k2) {int t=k1;k1=k2;k2=t;}
if(k1==0&&k2==5) return true;
else if(k1==1&&k2==4) return true;
else if(k1==2&&k2==7) return true;
else if(k1==3&&k2==6) return true;
return false;
}
bool IDAstar(int *p,int now,int pre)
{
if(depth-now<8-count(p)) return false;
if(now>=depth) return false;
int temp[30];
for(int i=0;i<8;i++)
{
if(repeat(pre,i)) continue;
for(int j=1;j<=24;j++)
temp[j]=p[j];
switch(i)
{
case 0:rotate(temp,1,3,7,12,16,21,23);out[now]='A';break;
case 1:rotate(temp,2,4,9,13,18,22,24);out[now]='B';break;
case 2:rotate(temp,11,10,9,8,7,6,5);out[now]='C';break;
case 3:rotate(temp,20,19,18,17,16,15,14);out[now]='D';break;
case 4:rotate(temp,24,22,18,13,9,4,2);out[now]='E';break;
case 5:rotate(temp,23,21,16,12,7,3,1);out[now]='F';break;
case 6:rotate(temp,14,15,16,17,18,19,20);out[now]='G';break;
case 7:rotate(temp,5,6,7,8,9,10,11);out[now]='H';break;
}
if(isok(temp))
{
out[now+1]='\0';
ans=temp[7];
return true;
}
if(IDAstar(temp,now+1,i))
return true;
}
return false;
}
int main()
{
while(scanf("%d",&a[1])&&a[1])
{
memset(out,0,sizeof(out));
for(int i=2;i<=24;i++)
scanf("%d",&a[i]);
if(isok(a))
{
printf("No moves needed\n");
printf("%d\n",a[7]);
}
else{
for(depth=1;;depth++)
{
if(IDAstar(a,0,-100)) {break;}
}
printf("%s\n",out);
printf("%d\n",ans);
}
}
return 0;
}
POJ 2286 The Rotation Game(IDA*)
最新推荐文章于 2020-02-01 18:43:42 发布