记录编号 42440 评测结果 AAAAAAATAA
题目名称 [NOIP 2004]虫食算 最终得分 90
用户昵称 GravatarTruth.Cirno 是否通过 未通过
代码语言 C++ 运行时间 0.137 s
提交时间 2012-09-24 21:03:34 内存使用 0.29 MiB
显示代码纯文本
#include <cstdio>
using namespace std;

int n,a[3][30]={0},rul[30];
bool used[30],found=false;

void dfs(int which,int pos,int jin)
{
	int i;
	if (pos<0)
	{
		if (jin)
			return;
		found=true;
		for (i=0;i<n-1;i++)
			printf("%d ",rul[i]);
		printf("%d\n",rul[n-1]);
		return;
	}
	if (which==0)
	{
		if (rul[a[0][pos]]==-1)
		{
			for (i=n-1;i>=0;i--)
			{
				if (!used[i])
				{
					rul[a[0][pos]]=i;
					used[i]=true;
					dfs(1,pos,jin);
					if (found)
						return;
					rul[a[0][pos]]=-1;
					used[i]=false;
				}
			}
		}
		else
		{
			dfs(1,pos,jin);
			if (found)
				return;
		}
	}
	else if (which==1)
	{
		if (rul[a[1][pos]]==-1)
		{
			for (i=n-1;i>=0;i--)
			{
				if (!used[i])
				{
					rul[a[1][pos]]=i;
					used[i]=true;
					dfs(2,pos,jin);
					if (found)
						return;
					rul[a[1][pos]]=-1;
					used[i]=false;
				}
			}
		}
		else
		{
			dfs(2,pos,jin);
			if (found)
				return;
		}
	}
	else// if (which==2)
	{
		int temp;
		temp=rul[a[0][pos]]+rul[a[1][pos]]+jin;
		if (rul[a[2][pos]]==-1)
		{
			for (i=n-1;i>=0;i--)
			{
				if (!used[i]&&temp%n==i)
				{
					rul[a[2][pos]]=i;
					used[i]=true;
					dfs(0,pos-1,temp/n);
					if (found)
						return;
					rul[a[2][pos]]=-1;
					used[i]=false;
				}
			}
		}
		else
		{
			if (temp%n==rul[a[2][pos]])
			{
				dfs(0,pos-1,temp/n);
				if (found)
					return;
			}
		}
	}
}

int main(void)
{
	freopen("alpha.in","r",stdin);
	freopen("alpha.out","w",stdout);
	int i;
	char cha[30]={0},chb[30]={0},chc[30]={0};
	scanf("%d\n",&n);
	scanf("%s\n%s\n%s\n",&cha,&chb,&chc);
	for (i=0;i<n;i++)
	{
		a[0][i]=cha[i]-'A';
		a[1][i]=chb[i]-'A';
		a[2][i]=chc[i]-'A';
		rul[i]=-1;
	}
	dfs(0,n-1,0);
	return(0);
}