记录编号 |
204826 |
评测结果 |
AAAAAAAAAA |
题目名称 |
[NOIP 2004]虫食算 |
最终得分 |
100 |
用户昵称 |
神利·代目 |
是否通过 |
通过 |
代码语言 |
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);
}