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