//很纯很纯的IDA*,在dfs时,要判断当前剩下的深度和中间出现个数最大值做比较
//函数fit---目标状态是否已经存在
//函数count---统计中间8个位置1、2、3出现的个数,并返回最大值
//函数isok---是否之前旋转相冲突
//函数swap---旋转
#include <iostream>
#include<stdio.h>
#include<string.h>
using namespace std;
int ans[25],resf;
char str[10000];
int n,m,t;
bool init()
{
scanf("%d",&ans[1]);
if(!ans[1]) return 0;
for(int i=2;i<25;i++) scanf("%d",&ans[i]);
return 1;
}
bool fit(int* mid)
{
if(mid[7]!=mid[8]||mid[7]!=mid[9]||mid[7]!=mid[12]||mid[7]!=mid[13]
||mid[7]!=mid[16]||mid[7]!=mid[17]||mid[7]!=mid[18]) return 0;
return 1;
}
int count(int* mid)
{
int cnt[4]={0,0,0,0};
cnt[mid[7]]++,cnt[mid[8]]++,cnt[mid[9]]++;
cnt[mid[12]]++,cnt[mid[13]]++,cnt[mid[16]]++;
cnt[mid[17]]++,cnt[mid[18]]++;
return max(cnt[1],max(cnt[2],cnt[3]));
}
bool isok(int f,int p)
{
if(f==1&&p==6||(f==2&&p==5)||(f==3&&p==8)||(f==4&&p==7)
||(f==5&&p==2)||(f==6&&p==1)||(f==7&&p==4)||(f==8&&p==3))
return 1;
return 0;
}
void swap(int* &mid,int a,int b,int c,int d,int e,int f,int g)
{
int pt=mid[a];
mid[a]=mid[b],mid[b]=mid[c],mid[c]=mid[d];
mid[d]=mid[e],mid[e]=mid[f],mid[f]=mid[g],mid[g]=pt;
}
bool dfs(int* mid,int dep,int f)
{
if(fit(mid))
{
str[dep]='\0';
resf=mid[7];
return 1;
}
if(t-dep<8-count(mid)) return 0;
if(dep>=t) return 0;
for(int i=1;i<=8;i++)
{
if(isok(f,i)) continue;
if(i==1) swap(mid,1,3,7,12,16,21,23);
if(i==2) swap(mid,2,4,9,13,18,22,24);
if(i==3) swap(mid,11,10,9,8,7,6,5);
if(i==4) swap(mid,20,19,18,17,16,15,14);
if(i==5) swap(mid,24,22,18,13,9,4,2);
if(i==6) swap(mid,23,21,16,12,7,3,1);
if(i==7) swap(mid,14,15,16,17,18,19,20);
if(i==8) swap(mid,5,6,7,8,9,10,11);
str[dep]=i-1+'A';
if(dfs(mid,dep+1,i)) return 1;
if(i==6) swap(mid,1,3,7,12,16,21,23);
if(i==5) swap(mid,2,4,9,13,18,22,24);
if(i==8) swap(mid,11,10,9,8,7,6,5);
if(i==7) swap(mid,20,19,18,17,16,15,14);
if(i==2) swap(mid,24,22,18,13,9,4,2);
if(i==1) swap(mid,23,21,16,12,7,3,1);
if(i==4) swap(mid,14,15,16,17,18,19,20);
if(i==3) swap(mid,5,6,7,8,9,10,11);
}
return 0;
}
int main()
{
int i,j,k;
while(init())
{
if(fit(ans))
{
puts("No moves needed");
printf("%d\n",ans[7]);
continue;
}
for(t=1;;t++)
{
if(dfs(ans,0,-1)) break;
}
printf("%s\n%d\n",str,resf);
}
return 0;
}
poj2286---IDA*
最新推荐文章于 2021-05-21 10:34:47 发布