记录编号 232466 评测结果 AAAAAAAAAA
题目名称 [UVA 11163]豹王 最终得分 100
用户昵称 Gravatarmikumikumi 是否通过 通过
代码语言 C++ 运行时间 4.386 s
提交时间 2016-03-01 15:27:43 内存使用 0.26 MiB
显示代码纯文本
#include<cstdio>
#include<iostream>
using namespace std;
const int SIZEN=41,INF=0x7fffffff/8;
int go[4][4]={{-3,-1,4,-4},{1,3,4,-4},{1,-1,4,-4},{1,-1,4,-4}};
int g[SIZEN][SIZEN];
void prepare()
{
	for(int i=1;i<=40;i++) for(int j=1;j<=40;j++) g[i][j]=INF;
	for(int i=1;i<=40;i++) for(int j=0;j<4;j++) g[i][i+go[i%4][j]]=1;
	for(int i=1;i<=40;i++) g[i][i]=0;
	for(int k=1;k<=40;k++)for(int i=1;i<=40;i++)for(int j=1;j<=40;j++) g[i][j]=min(g[i][j],g[i][k]+g[k][j]);
}
int N,T=0,a[SIZEN],pos;
bool read()
{
	scanf("%d",&N);
	if(!N) return 0;
	T++;
	for(int i=1;i<=N;i++)
	{
		scanf("%d",&a[i]);
		if(a[i]==1) pos=i;
	}
	return 1;
}
int ans=0;
bool dfs(int deep,int dabo,int now,int fa)
{
	if(dabo<=0) return 1;
	if(deep+dabo>ans) return 0;
	for(int i=0;i<4;i++)
	{
		int x=now+go[now%4][i];
		if(x==fa||x<1||x>N) continue;
		int kk=dabo-g[x][a[x]]+g[now][a[x]];
		if(kk<0) return 1;
		a[now]=a[x];a[x]=1;
		if(dfs(deep+1,kk,x,now)) return 1;
		a[x]=a[now];a[now]=1;
	}
	return 0;
}
void work()
{
	//printf("Set ");
	//printf("%d",T);
	//printf(":\n");
	int dabo=0;//估计函数
	for(int i=1;i<=N;i++) dabo+=g[i][a[i]];
	dabo-=g[pos][1];
	//cout<<g[4][1]<<endl;
	for(ans=0;ans<=INF;ans++)
	{
		//cout<<T<<" "<<ans<<endl;
		if(dfs(0,dabo,pos,-1)) break;
	}
	printf("%d\n",ans);
}
int main()
{
	freopen("uva11163.in","r",stdin);
	freopen("uva11163.out","w",stdout);
	prepare();
	while(read()) work();
	return 0;
}