1028 - 启发式搜索 - 骑士精神(BZOJ 1085)

版权声明:虽然我只是个小蒟蒻但转载也请注明出处哦 https://blog.csdn.net/weixin_42557561/article/details/83476216

传送门

Share

开心开心,自己写出来的一道IDA*(虽然确实很板子,但还是很开心的)
具体的思路及想法和八数码简直一模一样,那就随便选一种写法写咯~~~
我就不再赘述啦

TIPS

需要小小的注意一下,这个骑士啊,是可以走八个方向的(最开始写的4个,老是过不了样例)

Code
#include<bits/stdc++.h>
using namespace std;
int T,k,fx,fy,ok=0;
char a[6][6],ans[6][6]={
	'0','0','0','0','0','0',
	'0','1','1','1','1','1',
	'0','0','1','1','1','1',
	'0','0','0','*','1','1',
	'0','0','0','0','0','1',
	'0','0','0','0','0','0'
};
int dx[8]={-1,-2,-2,-1,1,2,2,1};
int dy[8]={-2,-1,1,2,-2,-1,1,2};//为了方便优化,这个地方顺序一定不要打错 
bool check(){
	for(int i=1;i<=5;++i)
		for(int j=1;j<=5;++j)
			if(a[i][j]!=ans[i][j]) return 0;
	return 1;
}
bool eval(int stp){
	int num=0;
	for(int i=1;i<=5;++i)
		for(int j=1;j<=5;++j)
			if(a[i][j]!=ans[i][j]){
				num++;
				if(num+stp>k) return 0;
			}
	return 1;
}
void A_star(int dep,int x,int y,int pre){
	if(dep==k){if(check()) ok=1;return;}
	if(ok) return ;
	for(int i=0;i<8;++i){
		int xx=x+dx[i];
		int yy=y+dy[i];
		if(xx<1||xx>5||yy<1||yy>5||pre+i==7) continue;
		swap(a[xx][yy],a[x][y]);
		if(!ok&&eval(dep)) A_star(dep+1,xx,yy,i);
		swap(a[xx][yy],a[x][y]);
	}
}
int main(){
	scanf("%d",&T);
	int i,j;
	while(T--){
		k=0;ok=0;
		for(i=1;i<=5;++i)
			for(j=1;j<=5;++j)
			{
				char c=getchar();
				while(c!='0'&&c!='1'&&c!='*') c=getchar();
				a[i][j]=c;
				if(a[i][j]=='*') fx=i,fy=j;
			}
		if(check()) {	printf("0\n");continue;}
		for(k=1;k<=15;++k){
			A_star(0,fx,fy,-1);
			if(ok){printf("%d\n",k);break;} 
		}
		if(k>15) printf("-1\n");
	}
	return 0;
}

猜你喜欢

转载自blog.csdn.net/weixin_42557561/article/details/83476216