关于15数码
  • 板块题目总版
  • 楼主Frielen
  • 当前回复0
  • 已保存回复0
  • 发布时间2024/7/6 13:42
  • 上次更新2024/7/6 15:52:55
查看原帖
关于15数码
1125685
Frielen楼主2024/7/6 13:42

做完八数码就想着写一下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
2024/7/6 13:42
加载中...