记录编号 |
340959 |
评测结果 |
AAAAAAAAAA |
题目名称 |
[NOIP 2004]虫食算 |
最终得分 |
100 |
用户昵称 |
苦读依旧 |
是否通过 |
通过 |
代码语言 |
C++ |
运行时间 |
0.337 s |
提交时间 |
2016-11-07 09:16:28 |
内存使用 |
0.31 MiB |
显示代码纯文本
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int h[27];
int a[27];
int b[27];
int c[27];
bool bl[27];
bool ans=0;
int dfs(int x,int n,bool carry)
{
bool pd=1;
if(x==n+1) {
for(int i=1;i<=n;++i) {
printf("%d ",h[i]);
}
ans=1;
}
if(ans) {
return 0;
}
if(x==n) {
pd=0;
}
/* if(x==2) {
cout<<" ";
for(int i=1;i<=n;++i) {
printf("%d ",h[i]);
}
cout<<endl;
}*/
/*if(x==3) {
return 0;
}*/
if(h[a[x]]==-1&&h[b[x]]==-1&&h[c[x]]==-1) {
for(int i=0;i<n;++i) {
if(!bl[i]) {
bl[i]=1;
h[a[x]]=i;
dfs(x,n,carry);
h[a[x]]=-1;
bl[i]=0;
}
}
return 0;
}
if(h[a[x]]!=-1&&h[b[x]]!=-1&&h[c[x]]!=-1) {
if(carry) {
if(h[a[x]]+h[b[x]]==h[c[x]]+n) {
dfs(x+1,n,0);
}
if(pd&&h[a[x]]+h[b[x]]+1==h[c[x]]+n) {
dfs(x+1,n,1);
}
}
else {
if(h[a[x]]+h[b[x]]==h[c[x]]) {
dfs(x+1,n,0);
}
if(pd&&h[a[x]]+h[b[x]]+1==h[c[x]]) {
dfs(x+1,n,1);
}
}
return 0;
}
if(h[a[x]]!=-1&&h[b[x]]==-1&&h[c[x]]==-1) {
for(int i=0;i<n;++i) {
if(!bl[i]) {
h[b[x]]=i;
bl[i]=1;
dfs(x,n,carry);
h[b[x]]=-1;
bl[i]=0;
}
}
return 0;
}
if(h[a[x]]==-1&&h[b[x]]!=-1&&h[c[x]]==-1) {
for(int i=0;i<n;++i) {
if(!bl[i]) {
h[a[x]]=i;
bl[i]=1;
dfs(x,n,carry);
h[a[x]]=-1;
bl[i]=0;
}
}
return 0;
}
if(h[a[x]]==-1&&h[b[x]]==-1&&h[c[x]]!=-1) {
for(int i=0;i<n;++i) {
if(!bl[i]) {
h[a[x]]=i;
bl[i]=1;
dfs(x,n,carry);
h[a[x]]=-1;
bl[i]=0;
}
}
return 0;
}
if(h[a[x]]!=-1&&h[b[x]]==-1&&h[c[x]]!=-1) {
int cc=h[c[x]]-h[a[x]];
if(cc==0) {
if(!bl[0]&&!carry) {
h[b[x]]=0;
bl[0]=1;
dfs(x+1,n,0);
bl[0]=0;
h[b[x]]=-1;
}
if(!bl[1]&&!carry) {
h[b[x]]=1;
bl[1]=1;
dfs(x+1,n,1);
bl[1]=0;
h[b[x]]=-1;
}
if(!bl[n-1]&&carry) {
h[b[x]]=n-1;
bl[n-1]=1;
dfs(x+1,n,1);
bl[n-1]=0;
h[b[x]]=-1;
}
}
if(cc<0) {
if(!carry) return 0;
if(!bl[(cc+n)%n]) {
h[b[x]]=h[c[x]]+n-h[a[x]];
bl[h[b[x]]]=1;
dfs(x+1,n,0);
bl[h[b[x]]]=0;
h[b[x]]=-1;
}
if(pd&&!bl[(cc+n-1)]) {
h[b[x]]=h[c[x]]+n-h[a[x]]-1;
bl[h[b[x]]]=1;
dfs(x+1,n,1);
bl[h[b[x]]]=0;
h[b[x]]=-1;
}
}
if(cc>0) {
if(carry) return 0;
if(!bl[cc%n]) {
h[b[x]]=h[c[x]]-h[a[x]];
bl[h[b[x]]]=1;
dfs(x+1,n,0);
bl[h[b[x]]]=0;
h[b[x]]=-1;
}
if(pd&&!bl[(cc-1)%n]) {
h[b[x]]=h[c[x]]-h[a[x]]-1;
bl[h[b[x]]]=1;
dfs(x+1,n,1);
bl[h[b[x]]]=0;
h[b[x]]=-1;
}
}
return 0;
}
if(h[a[x]]==-1&&h[b[x]]!=-1&&h[c[x]]!=-1) {
int cc=h[c[x]]-h[b[x]];
if(cc==0) {
if(!bl[0]&&!carry) {
h[a[x]]=0;
bl[0]=1;
dfs(x+1,n,0);
bl[0]=0;
h[a[x]]=-1;
}
if(!bl[1]&&!carry) {
h[a[x]]=1;
bl[1]=1;
dfs(x+1,n,1);
bl[1]=0;
h[a[x]]=-1;
}
if(!bl[n-1]&&carry) {
h[a[x]]=n-1;
bl[n-1]=1;
dfs(x+1,n,1);
bl[n-1]=0;
h[a[x]]=-1;
}
}
if(cc<0) {
if(!carry) return 0;
if(!bl[(cc+n)%n]) {
h[a[x]]=(h[c[x]]+n-h[b[x]])%n;
bl[h[a[x]]]=1;
dfs(x+1,n,0);
bl[h[a[x]]]=0;
h[a[x]]=-1;
}
if(pd&&!bl[(cc+n-1)%n]) {
h[a[x]]=h[c[x]]+n-h[b[x]]-1;
bl[h[a[x]]]=1;
dfs(x+1,n,1);
bl[h[a[x]]]=0;
h[a[x]]=-1;
}
}
if(cc>0) {
if(carry) return 0;
if(!bl[cc%n]) {
h[a[x]]=h[c[x]]-h[b[x]];
bl[h[a[x]]]=1;
dfs(x+1,n,0);
bl[h[a[x]]]=0;
h[a[x]]=-1;
}
if(pd&&!bl[(cc-1)%n]) {
h[a[x]]=h[c[x]]-h[b[x]]-1;
bl[h[a[x]]]=1;
dfs(x+1,n,1);
bl[h[a[x]]]=0;
h[a[x]]=-1;
}
}
return 0;
}
if(h[a[x]]!=-1&&h[b[x]]!=-1&&h[c[x]]==-1) {
// cout<<x<<endl;
if(carry) {
if(h[a[x]]+h[b[x]]<n-1) {
return 0;
}
else {
if(!bl[(h[a[x]]+h[b[x]]+1)%n]&&h[a[x]]+h[b[x]]>=n-1) {
h[c[x]]=(h[a[x]]+h[b[x]]+1)%n;
bl[h[c[x]]]=1;
dfs(x+1,n,1);
bl[h[c[x]]]=0;
h[c[x]]=-1;
}
if(!bl[(h[a[x]]+h[b[x]])%n]&&h[a[x]]+h[b[x]]>=n) {
h[c[x]]=(h[a[x]]+h[b[x]])%n;
bl[h[c[x]]]=1;
dfs(x+1,n,0);
bl[h[c[x]]]=0;
h[c[x]]=-1;
}
}
}
else {
if(h[a[x]]+h[b[x]]>=n) {
return 0;
}
else {
if(pd&&h[a[x]]+h[b[x]]<n-1&&!bl[h[a[x]]+h[b[x]]+1]) {
h[c[x]]=h[a[x]]+h[b[x]]+1;
bl[h[c[x]]]=1;
dfs(x+1,n,1);
bl[h[c[x]]]=0;
h[c[x]]=-1;
}
if(!bl[h[a[x]]+h[b[x]]]) {
bl[h[a[x]]+h[b[x]]]=1;
h[c[x]]=h[a[x]]+h[b[x]];
dfs(x+1,n,0);
bl[h[c[x]]]=0;
h[c[x]]=-1;
}
}
}
return 0;
}
}
int main()
{
freopen("alpha.in","r",stdin);
freopen("alpha.out","w",stdout);
//freopen("1.in","r",stdin);
memset(h,-1,sizeof(h));
int n;
scanf("%d",&n);
getchar();
for(int i=1;i<=n;++i) {
char x;
x=getchar();
a[i]=(int)(x-64);
}
getchar();
for(int i=1;i<=n;++i) {
char x;
x=getchar();
b[i]=(int)(x-64);
}
getchar();
for(int i=1;i<=n;++i) {
char x;
x=getchar();
c[i]=(int)(x-64);
}
dfs(1,n,0);
// dfs(1,n,1);
}