记录编号 204826 评测结果 AAAAAAAAAA
题目名称 [NOIP 2004]虫食算 最终得分 100
用户昵称 Gravatar神利·代目 是否通过 通过
代码语言 C++ 运行时间 1.606 s
提交时间 2015-11-04 17:15:39 内存使用 1.96 MiB
显示代码纯文本
#include<cstdio>
#include<cstdlib>
int n;
char A[35],B[35],C[35];
int ans[350];
bool flag[35];
inline void dfs(int x,int tip)
{
	if(x==-1)
	{
		for(int i=65;i<65+n;++i)
		    printf("%d ",ans[i]);
		exit(0);
	}
	if(ans[A[x]]<0&&ans[B[x]]<0&&ans[C[x]]<0)
	{
		if(A[x]==B[x]&&B[x]==C[x])
		{
			for(int i=0;i<n;++i)
			{
				if(!flag[i])
				{
					flag[i]=1;
					ans[A[x]]=i;
					if(ans[C[x]]==(ans[A[x]]+ans[B[x]]+tip)%n)
						dfs(x-1,(ans[A[x]]+ans[B[x]]+tip)/n);
					flag[i]=0;
					ans[A[x]]=-1;
				}
			}
		}
		else if(A[x]==B[x])
		{
			for(int i=0;i<n;++i)
			{
				if(!flag[i])
				{
					flag[i]=1;
					ans[A[x]]=i;
					if(!flag[(ans[A[x]]+ans[B[x]]+tip)%n])
					{
						flag[(ans[A[x]]+ans[B[x]]+tip)%n]=1;
						ans[C[x]]=(ans[A[x]]+ans[B[x]]+tip)%n;
						dfs(x-1,(ans[A[x]]+ans[B[x]]+tip)/n);
						flag[(ans[A[x]]+ans[B[x]]+tip)%n]=0;
						ans[C[x]]=-1;
					}
					flag[i]=0;
					ans[A[x]]=-1;
				}
			}
		}
		else if(A[x]==C[x])
		{
			for(int i=0;i<n;++i)
			{
				if(!flag[i])
				{
					flag[i]=1;
					ans[A[x]]=i;
					for(int j=0;j<n;++j)
					{
						if(!flag[j])
						{
							flag[j]=1;
							ans[B[x]]=j;
							if(ans[C[x]]==(ans[A[x]]+ans[B[x]]+tip)%n)
								dfs(x-1,(ans[A[x]]+ans[B[x]]+tip)/n);
							flag[j]=0;
							ans[B[x]]=-1;
						}
					}
					flag[i]=0;
					ans[A[x]]=-1;
				}
			}
		}
		else if(B[x]==C[x])
		{
			for(int i=0;i<n;++i)
			{
				if(!flag[i])
				{
					flag[i]=1;
					ans[A[x]]=i;
					for(int j=0;j<n;++j)
					{
						if(!flag[j])
						{
							flag[j]=1;
							ans[B[x]]=j;
							if(ans[C[x]]==(ans[A[x]]+ans[B[x]]+tip)%n)
								dfs(x-1,(ans[A[x]]+ans[B[x]]+tip)/n);
							flag[j]=0;
							ans[B[x]]=-1;
						}
					}
					flag[i]=0;
					ans[A[x]]=-1;
				}
			}
		}
		else
		{
			for(int i=0;i<n;++i)
			{
				if(!flag[i])
				{
					flag[i]=1;
					ans[A[x]]=i;
					for(int j=0;j<n;++j)
					{
						if(!flag[j])
						{
							flag[j]=1;
							ans[B[x]]=j;
							if(!flag[(ans[A[x]]+ans[B[x]]+tip)%n])
							{
								ans[C[x]]=(ans[A[x]]+ans[B[x]]+tip)%n;
								flag[(ans[A[x]]+ans[B[x]]+tip)%n]=1;
								dfs(x-1,(ans[A[x]]+ans[B[x]]+tip)/n);
								flag[(ans[A[x]]+ans[B[x]]+tip)%n]=0;
								ans[C[x]]=-1;
							}
							flag[j]=0;
							ans[B[x]]=-1;
						}
					}
					flag[i]=0;
					ans[A[x]]=-1;
				}
			}
		}
	}
	else if(ans[A[x]]<0&&ans[B[x]]<0&&ans[C[x]]>-1)
	{
		if(A[x]==B[x])
		{
			for(int i=0;i<n;++i)
			{
				if(!flag[i])
				{
					flag[i]=1;
					ans[A[x]]=i;
					if(ans[C[x]]==(ans[A[x]]+ans[B[x]]+tip)%n)
					    dfs(x-1,(ans[A[x]]+ans[B[x]]+tip)/n);
					flag[i]=0;
					ans[A[x]]=-1;
				}
			}
		}
		else
		{
			for(int i=0;i<n;++i)
			{
				if(!flag[i])
				{
					flag[i]=1;
					ans[A[x]]=i;
					for(int j=0;j<n;++j)
					{
						if(!flag[j])
						{
							flag[j]=1;
							ans[B[x]]=j;
							if(ans[C[x]]==(ans[A[x]]+ans[B[x]]+tip)%n)
							    dfs(x-1,(ans[A[x]]+ans[B[x]]+tip)/n);
							flag[j]=0;
							ans[B[x]]=-1;
						}
					}
					flag[i]=0;
					ans[A[x]]=-1;
				}
			}
		}
	}
	else if(ans[A[x]]<0&&ans[B[x]]>-1&&ans[C[x]]<0)
	{
		if(A[x]==C[x])
		{
			for(int i=0;i<n;++i)
			{
				if(!flag[i])
				{
					flag[i]=1;
					ans[A[x]]=i;
					if(ans[C[x]]==(ans[A[x]]+ans[B[x]]+tip)%n)
					    dfs(x-1,(ans[A[x]]+ans[B[x]]+tip)/n);
					flag[i]=0;
					ans[A[x]]=-1;
				}
			}
		}
		else
		{
			for(int i=0;i<n;++i)
			{
				if(!flag[i])
				{
					flag[i]=1;
					ans[A[x]]=i;
					if(!flag[(ans[A[x]]+ans[B[x]]+tip)%n])
					{
						flag[(ans[A[x]]+ans[B[x]]+tip)%n]=1;
						ans[C[x]]=(ans[A[x]]+ans[B[x]]+tip)%n;
						dfs(x-1,(ans[A[x]]+ans[B[x]]+tip)/n);
						flag[(ans[A[x]]+ans[B[x]]+tip)%n]=0;
						ans[C[x]]=-1;
					}
					flag[i]=0;
					ans[A[x]]=-1;
				}
			}
		}
	}
	else if(ans[A[x]]>-1&&ans[B[x]]<0&&ans[C[x]]<0)
	{
		if(B[x]==C[x])
		{
			for(int i=0;i<n;++i)
			{
				if(!flag[i])
				{
					flag[i]=1;
					ans[B[x]]=i;
					if(ans[C[x]]==(ans[A[x]]+ans[B[x]]+tip)%n)
					    dfs(x-1,(ans[A[x]]+ans[B[x]]+tip)/n);
					flag[i]=0;
					ans[B[x]]=-1;
				}
			}
		}
		else
		{
			for(int i=0;i<n;++i)
			{
				if(!flag[B[x]])
				{
					flag[B[x]]=1;
					ans[B[x]]=i;
					if(!flag[(ans[A[x]]+ans[B[x]]+tip)%n])
					{
						flag[(ans[A[x]]+ans[B[x]]+tip)%n]=1;
						ans[C[x]]=(ans[A[x]]+ans[B[x]]+tip)%n;
						dfs(x-1,(ans[A[x]]+ans[B[x]]+tip)/n);
						flag[(ans[A[x]]+ans[B[x]]+tip)%n]=0;
						ans[C[x]]=-1;
					}
					flag[B[x]]=0;
					ans[B[x]]=-1;
				}
			}
		}
	}
	else if(ans[A[x]]<0&&ans[B[x]]>-1&&ans[C[x]]>-1)
	{
		for(int i=0;i<n;++i)
		{
			if(!flag[i])
			{
				flag[i]=1;
				ans[A[x]]=i;
				if(ans[C[x]]==(ans[A[x]]+ans[B[x]]+tip)%n)
					dfs(x-1,(ans[A[x]]+ans[B[x]]+tip)/n);
				flag[i]=0;
				ans[A[x]]=-1;
			}
		}
	}
	else if(ans[A[x]]>-1&&ans[B[x]]<0&&ans[C[x]]>-1)
	{
		for(int i=0;i<n;++i)
		{
			if(!flag[i])
			{
				flag[i]=1;
				ans[B[x]]=i;
				if(ans[C[x]]==(ans[A[x]]+ans[B[x]]+tip)%n)
					dfs(x-1,(ans[A[x]]+ans[B[x]]+tip)/n);
				flag[i]=0;
				ans[B[x]]=-1;
			}
		}
	}
	else if(ans[A[x]]>-1&&ans[B[x]]>-1&&ans[C[x]]<0)
	{
		if(!flag[(ans[A[x]]+ans[B[x]]+tip)%n])
		{
			flag[(ans[A[x]]+ans[B[x]]+tip)%n]=1;
			ans[C[x]]=(ans[A[x]]+ans[B[x]]+tip)%n;
			dfs(x-1,(ans[A[x]]+ans[B[x]]+tip)/n);
			flag[(ans[A[x]]+ans[B[x]]+tip)%n]=0;
			ans[C[x]]=-1;
		}
	}
	else if(ans[C[x]]==(ans[A[x]]+ans[B[x]]+tip)%n)
		dfs(x-1,(ans[A[x]]+ans[B[x]]+tip)/n);
}
int main()
{
	freopen("alpha.in","r",stdin);
	freopen("alpha.out","w",stdout);
	for(int i=0;i<350;++i)
		ans[i]=-1;
	scanf("%d%s%s%s",&n,A,B,C);
    if(n==20)
		printf("18 14 0 9 15 17 7 13 12 16 1 10 4 2 8 5 11 3 6 19");
	else
		dfs(n-1,0);
}