(A*做法)样例没过,求条
查看原帖
(A*做法)样例没过,求条
636936
tyccyt楼主2024/9/28 16:01
#include <bits/stdc++.h>
using namespace std;
const int N=10;
int T,h[N][N],b[N][N],k,n=5;
bool judge=0;
int a[N][N]={
{0,0,0,0,0,0},
{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 d[8][2]={{1,2},{1,-2},{2,1},{2,-1},{-2,1},{-2,-1},{-1,2},{-1,-2}};
void init()
{
	for(int i=1;i<=n;i++)for(int j=1;j<=n;j++)h[i][j]=b[i][j];
}
int test(int s)
{
	int sum=0;
	for(int i=1;i<=n;i++)
	{
		for(int j=1;j<=n;j++)
		{
			if(a[i][j]!=h[i][j])
				if((++sum+s)>k)
					return 0;
		}
	}
	return 1;
}
void A(int s,int x,int y)
{
	if(s==k)
	{
		for(int i=1;i<=n;i++)
		{
			for(int j=1;j<=n;j++)
			{
				if(a[i][j]!=h[i][j])return;
			}
		}
		judge=1;
		return;
	}
	if(judge==1)return;
	for(int i=0;i<=7;i++)
	{
		int tx=x+d[i][0],ty=y+d[i][1];
		if(tx<1||ty<1||tx>n||ty>n)continue;
		if(test(s)&&judge==0)
		{
			swap(h[x][y],h[tx][ty]);
			A(s+1,tx,ty);
			swap(h[x][y],h[tx][ty]);
		}
	}
	return;
}
inline void solve()
{
	int flag=0,xx=0,yy=0;
	for(int i=1;i<=n;i++)
	{
		for(int j=1;j<=n;j++)
		{
			char c;
			cin>>c;
			if(c=='*')h[i][j]=2,xx=i,yy=j;
			else h[i][j]=c-'0';
			
			b[i][j]=h[i][j];
		}
	}
	judge=0;
	for(k=0;k<=15;k++)
	{
		init();
		A(0,xx,yy);
		if(judge)
		{
			cout<<k<<'\n';
			return;
		}
	}
	cout<<-1<<'\n';
	return;
}
int main()
{
	scanf("%d",&T);
	while(T--)solve();
	return 0;
}
2024/9/28 16:01
加载中...