IDA*样例不过求调
查看原帖
IDA*样例不过求调
1058570
tzhengqing楼主2024/11/11 20:10
#include<bits/stdc++.h>
using namespace std;
int mp[6][6],want[6][6]={0,1,1,1,1,1,0,0,1,1,1,1,0,0,0,2,1,1,0,0,0,0,0,1,0,0,0,0,0,0};
int dx[8]={-2,-1,1,2,2,1,-1,-2},dy[8]={-1,-2,-2,-1,1,2,2,1},d=0;
int h()
	{
	int cnt=0;
	for(int i=1;i<=5;i++)
		{
		for(int j=1;j<=5;j++)cnt+=mp[i][j]!=want[i][j];
		}
	return cnt;
	}
void dfs(int up,int now,int px,int py,int kx,int ky)
	{
	if(now==up)
		{
		if(h()==0){cout<<up<<'\n';d=1;}
		return;
		}
	if(now+h()>up)return;
	for(int i=0;i<8;i++)
		{
		int xx=kx+dx[i],yy=ky+dy[i];
		if(xx<1||xx>5||yy<1||yy>5/*||(xx==px&&yy==py)*/)continue;
		swap(mp[kx][ky],mp[xx][yy]);
		dfs(up,now+1,kx,ky,xx,yy);
		if(d)return;
		swap(mp[kx][ky],mp[xx][yy]);
		}
	}
void sol()
	{
	char c;int ki,kj;
	for(int i=1;i<=5;i++)
		{
		for(int j=1;j<=5;j++)
			{
			cin>>c;
			mp[i][j]=(c=='*'?2:c-48);
			if(c=='*'){ki=i;kj=j;}
			}
		}
	for(int i=0;i<=15&&!d;i++)dfs(i,0,0,0,ki,kj);
	if(d==0)cout<<-1<<'\n';
	d=0;
	}
int main()
	{
	int t;cin>>t;
	while(t--)sol();
	return 0;
	}


2024/11/11 20:10
加载中...