做完八数码就想着写一下15数码,然而我的IDA*没法判断是否有解,特此求助一下,谢谢!(各位dalao如果发现蒟蒻的代码有问题麻烦说一下)
#include<cstdio>
#define swap(a,b) tmp=a,a=b,b=tmp;
int ans[6][6]={{0,0,0,0,0},{0,1,2,3,4},{0,12,13,14,5},{0,11,0,15,6},{0,10,9,8,7}},f[6][6],k,x,y,tmp;
bool Check;
int tx[4]={0,1,-1,0};
int ty[4]={1,0,0,-1};
bool check(){
for(int i=1;i<=4;i++)
for(int j=1;j<=4;j++)
if(ans[i][j]!=f[i][j])
return 0;
return 1;
}
bool GuJia(int step){
int cnt=0;
for(int i=1;i<=4;i++)
for(int j=1;j<=4;j++)
if(ans[i][j]!=f[i][j])
if(++cnt+step>k)
return 0;
return 1;
}
void IDA(int step,int x,int y,int jz){
if(step==k){
if(check())
Check=1;
return;
}
if(Check) return;
for(int i=0;i<4;i++){
int X=x+tx[i],Y=y+ty[i];
if(X<4||X>4||Y<4||Y>4||jz+i==3)
continue;
swap(f[x][y],f[X][Y]);
if(GuJia(step)&&!Check)
IDA(step+1,X,Y,i);
swap(f[x][y],f[X][Y]);
}
}
int main(){
for(int i=0;i<16;i++){
scanf("%d",&f[i/4+1][i%4+1]);
if(!f[i/4+1][i%4+1]) x=i/4+1,y=i%4+1;
}
if(check()){
printf("0");
return 0;
}
while(1){
k++;
IDA(0,x,y,-1);
if(Check){
printf("%d",k);
return 0;
}
}
return 0;
}
末状态是:
1 2 3 4
12 13 14 5
11 0 15 6
10 9 8 7