思路
- 这是一道比较显然的IDA*题,只是对读入预处理及操作处理比较麻烦
- 注意剪枝:排除等效分支。
代码
#include<cstdio>
#define ri register int
using namespace std;
int a[8][8];
int n[25],tong[10];
char ans[100];
char c[9]={'\0','A','B','C','D','E','F','G','H'};
int fan[9]={0,6,5,8,7,2,1,4,3};
int k,f;
int read(){
int x=0;char c=getchar();
while(c>'9'||c<'0') c=getchar();
while(c>='0'&&c<='9') x=(x<<3)+(x<<1)+c-48,c=getchar();
return x;
}
void cz(int x){
int t;
if(x==1){
t=a[1][3];
for(ri i=1;i<=6;++i) a[i][3]=a[i+1][3];
a[7][3]=t;
}
if(x==2){
t=a[1][5];
for(ri i=1;i<=6;++i) a[i][5]=a[i+1][5];
a[7][5]=t;
}
if(x==3){
t=a[3][7];
for(ri i=7;i>=2;--i) a[3][i]=a[3][i-1];
a[3][1]=t;
}
if(x==4){
t=a[5][7];
for(ri i=7;i>=2;--i) a[5][i]=a[5][i-1];
a[5][1]=t;
}
if(x==5){
t=a[7][5];
for(ri i=7;i>=2;--i) a[i][5]=a[i-1][5];
a[1][5]=t;
}
if(x==6){
t=a[7][3];
for(ri i=7;i>=2;--i) a[i][3]=a[i-1][3];
a[1][3]=t;
}
if(x==7){
t=a[5][1];
for(ri i=1;i<=6;++i) a[5][i]=a[5][i+1];
a[5][7]=t;
}
if(x==8){
t=a[3][1];
for(ri i=1;i<=6;++i) a[3][i]=a[3][i+1];
a[3][7]=t;
}
}
void pre(){
a[1][3]=n[1],a[1][5]=n[2];
a[2][3]=n[3],a[2][5]=n[4];
for(ri i=1;i<=7;++i) a[3][i]=n[i+4];
a[4][3]=n[12],a[4][5]=n[13];
for(ri i=1;i<=7;++i) a[5][i]=n[i+13];
a[6][3]=n[21],a[6][5]=n[22];
a[7][3]=n[23],a[7][5]=n[24];
}
bool pd(){
int k=a[3][3];
for(ri i=3;i<=5;++i)
for(ri j=3;j<=5;++j)
{
if(i==4&&j==4) continue;
if(a[i][j]!=k) return 0;
}
return 1;
}
int max(int x,int y,int z){
if(y>x) x=y;
if(z>x) x=z;
return x;
}
int js(){
tong[1]=tong[2]=tong[3]=0;
for(ri i=3;i<=5;++i)
for(ri j=3;j<=5;++j)
{
if(i==4&&j==4) continue;
tong[a[i][j]]++;
}
return 8-max(tong[1],tong[2],tong[3]);
}
void dfs(int s,int la){
if(s>=k) return;
for(ri i=1;i<=8;++i)
{
if(i==fan[la]) continue;
cz(i);
ans[s]=c[i];
int tmp=js()+s;
if(pd())
{
f=1;
return;
}
if(tmp<=k) dfs(s+1,i);
if(f) return;
cz(fan[i]);
ans[s]=c[0];
}
}
void solve(){
for(ri i=1;i<=24;++i)
{
n[i]=read();
if(n[i]==0) return;
}
pre();k=f=0;
if(pd())
{
printf("No moves needed\n");
printf("%d\n",a[3][3]);
return;
}
while(++k)
{
dfs(0,0);
if(f)
{
for(ri i=0;i<k;++i) printf("%c",ans[i]);
printf("\n%d\n",a[3][3]);
break;
}
}
}
int main(){
n[1]=1;
while(n[1]) solve();
return 0;
}