萌新第一次写IDA*求助
查看原帖
萌新第一次写IDA*求助
113521
muyang_233楼主2020/8/1 20:16

RT,一直在输出-1.

#include <cstdio>
#include <algorithm>
using namespace std;
int t;
bool ok;
char st[7][7];
int dx[9]={-1,-2,-2,-1,1,2,2,1};
int dy[9]={-2,-1,1,2,2,1,-1,-2};
char ed[7][7]={{'1','1','1','1','1'},{'0','1','1','1','1'},{'0','0','*','1','1'},{'0','0','0','0','1'},{'0','0','0','0','0'}};
bool check(int x,int y){
	return x<1||x>5||y<1||y>5;
}
int value(){
	int res=0;
	for (int i=1;i<6;i++){
		for (int j=1;j<6;j++){
			if (st[i][j]!=ed[i][j]){
				++res;
			}
		}
	}
	return res;
}
void ida_star(int cnt,int x,int y,int dep){
//	printf("%d %d %d %d\n",cnt,x,y,dep);
	if (cnt==dep){
//		for (int i=1;i<6;i++){
//			for (int j=1;j<6;j++){
//				printf("%c",st[i][j]);
//			}
//			puts("");
//		}
		if (!value()){
			ok=true;
		}
		return;
	}
	for (int i=0;i<8;i++){
		int nx=x+dx[i];
		int ny=y+dy[i];
		if (check(nx,ny)) continue;
		swap(st[x][y],st[nx][ny]);
		int now=value();
		if (now+cnt<=dep){
			ida_star(cnt+1,nx,ny,dep);
		}
		swap(st[x][y],st[nx][ny]);
	}
}
int main(){
	scanf("%d",&t);
	while(t--){
		ok=false;
		for (int i=1;i<6;i++){
			scanf("%s",st[i]+1);
		}
		int sx,sy;
		for (int i=1;i<6;i++){
			for (int j=1;j<6;j++){
				if (st[i][j]=='*'){
					sx=i;
					sy=j;
					i=6;
					break;
				}
			}
		}
		for (int i=0;i<16;i++){
//			printf("%d %d %d %d\n",0,sx,sy,i);
			ida_star(0,sx,sy,i);
			if (ok){
				printf("%d\n",i);
				break;
			}
		}
		if (!ok){
			puts("-1");
		}
	}
	return 0;
}
2020/8/1 20:16
加载中...