IDA*调了一个点没过,全是-1
查看原帖
IDA*调了一个点没过,全是-1
550957
Anonymely楼主2022/7/2 11:53
#include<bits/stdc++.h>
using namespace std;

int flag;
int a[10][10];
int dx[8]={1,1,-1,-1,2,2,-2,-2};
int dy[8]={2,-2,2,-2,1,-1,1,-1};
int ed[10][10];

int check(){
	int cnt=0;
	for(int i=1;i<=5;i++){
		for(int j=1;j<=5;j++){
			if(a[i][j]!=ed[i][j])cnt++;
		}
	}
	return cnt;
}

void dfs(int now,int x,int y,int dep){
	if(now==dep){
		if(!check())flag=1;return ;
	}
	if(flag)return ;
	for(int i=0;i<8;i++){
		int xx=x+dx[i],yy=x+dy[i];
		if(xx<1||xx>5||yy<1||yy>5)continue;
		swap(a[x][y],a[xx][yy]);
		if(now+check()<=dep)dfs(now+1,xx,yy,dep);
		swap(a[x][y],a[xx][yy]);
	}
}

signed main(){
	for(int i=1;i<=5;i++)ed[1][i]=1;
	for(int i=2;i<=5;i++)ed[2][i]=1;
	ed[3][3]=2;
	for(int i=4;i<=5;i++)ed[3][i]=1;
	ed[4][5]=1;
//	for(int i=1;i<=5;i++){
//		for(int j=1;j<=5;j++){
//			cout<<ed[i][j];
//		}
//		cout<<endl;
//	}
	int t;cin>>t;
	while(t--){
		flag=0;
		int k1,k2;
		for(int i=1;i<=5;i++){
			for(int j=1;j<=5;j++){
				char ch;cin>>ch;
				if(ch=='0')a[i][j]=0;
				if(ch=='1')a[i][j]=1;
				if(ch=='*')a[i][j]=2,k1=i,k2=j;
			}
		}
		for(int dep=0;dep<=15;dep++){
			dfs(0,k1,k2,dep);
			if(flag){
				cout<<dep<<"\n";break;
			}
		}
		if(!flag)cout<<"-1\n";
	}
}

样例全输出-1,心态已炸,求调

2022/7/2 11:53
加载中...