记录编号 307443 评测结果 AAAAAAAAAA
题目名称 [NOIP 2004]虫食算 最终得分 100
用户昵称 GravatarRapiz 是否通过 通过
代码语言 C++ 运行时间 0.070 s
提交时间 2016-09-15 11:58:28 内存使用 0.23 MiB
显示代码纯文本
#include<cstdio>
#include<cstring>
#include<cstdlib>
const int MAXN=30;
char f[3][MAXN];
int n,c2d[256];
bool usd[MAXN];
inline bool alck(int y){
	for(int i=1;i<y;i++) {
		int a=c2d[f[0][i]],b=c2d[f[1][i]],c=c2d[f[2][i]];
		if(a==-1||b==-1||c==-1) continue;
		if((c-a-b+n)%n>2*(n-1)/n) return false;
	}
	return true;
}
void dfs(int x,int y,int g){//x行y列  进了g 
	if(x==2) {
		int c=c2d[f[0][y]]+c2d[f[1][y]]+g;
		if(c%n!=c2d[f[2][y]]) return;
		else if(c>=n) dfs(0,y-1,c/n);
		else dfs(0,y-1,0);
		return;
	}
	if(y==0){
		for(int i='A';i<='A'+n-1;i++) printf("%d ",c2d[i]);
		exit(0);
	}
	if(c2d[f[x][y]]==-1){
		for(int i=n-1;i>=0;i--) if(!usd[i]){
			usd[c2d[f[x][y]]=i]=1;
			/*
			if(!alck(y)){
				usd[c2d[f[x][y]]]=0;
				c2d[f[x][y]]=-1;
				continue;
			}*/
			if(x==0){
				if(c2d[f[1][y]]!=-1) {
					if(c2d[f[2][y]]==-1){
						c2d[f[2][y]]=(c2d[f[0][y]]+c2d[f[1][y]]+g)%n;
						if(!usd[c2d[f[2][y]]]&&alck(y)) usd[c2d[f[2][y]]]=1,dfs(2,y,g),usd[c2d[f[2][y]]]=0;
						c2d[f[2][y]]=-1;
					}
					else if(c2d[f[2][y]]==(c2d[f[0][y]]+c2d[f[1][y]]+g)%n){
						dfs(2,y,g);
					}
				}
				else if(c2d[f[2][y]]!=-1){//means c2d[f[1][y]]==-1
					int c=c2d[f[2][y]]-c2d[f[0][y]]-g;
					if(c<0) c+=n;
					c2d[f[1][y]]=c;
					if(!usd[c]&&alck(y)) usd[c]=1,dfs(1,y,g),usd[c]=0;
					c2d[f[1][y]]=-1;
				}
				else dfs(x+1,y,g);
			}
			else if(x==1){
				if(c2d[f[2][y]]==-1){
					c2d[f[2][y]]=(c2d[f[0][y]]+c2d[f[1][y]]+g)%n;
					if(!usd[c2d[f[2][y]]]&&alck(y)) usd[c2d[f[2][y]]]=1,dfs(2,y,g),usd[c2d[f[2][y]]]=0;
					c2d[f[2][y]]=-1;
				}
				else if(c2d[f[2][y]]==(c2d[f[0][y]]+c2d[f[1][y]]+g)%n){//c2d[f[2][y]]!=-1
					dfs(x+1,y,g);
				}
			}
			else printf("cannot reach\n");
			usd[c2d[f[x][y]]]=0;
			c2d[f[x][y]]=-1;
		}
	//	if(c2d[f[x][y]]==-1) return;
	}
	else {
			if(x==0){
				if(c2d[f[1][y]]!=-1) {
					if(c2d[f[2][y]]==-1){
						c2d[f[2][y]]=(c2d[f[0][y]]+c2d[f[1][y]]+g)%n;
						if(!usd[c2d[f[2][y]]]&&alck(y)) usd[c2d[f[2][y]]]=1,dfs(2,y,g),usd[c2d[f[2][y]]]=0;
						c2d[f[2][y]]=-1;
					}
					else if(c2d[f[2][y]]==(c2d[f[0][y]]+c2d[f[1][y]]+g)%n){
						dfs(2,y,g);
					}
				}
				else if(c2d[f[2][y]]!=-1){//means c2d[f[1][y]]==-1
					int c=c2d[f[2][y]]-c2d[f[0][y]]-g;
					if(c<0) c+=n;
					c2d[f[1][y]]=c;
					if(!usd[c]&&alck(y)) usd[c]=1,dfs(1,y,g),usd[c]=0;
					c2d[f[1][y]]=-1;
				}
				else dfs(x+1,y,g);
			}
			else if(x==1){
				if(c2d[f[2][y]]==-1){
					c2d[f[2][y]]=(c2d[f[0][y]]+c2d[f[1][y]]+g)%n;
					if(!usd[c2d[f[2][y]]]&&alck(y)) usd[c2d[f[2][y]]]=1,dfs(2,y,g),usd[c2d[f[2][y]]]=0;
					c2d[f[2][y]]=-1;
				}
				else if(c2d[f[2][y]]==(c2d[f[0][y]]+c2d[f[1][y]]+g)%n){//c2d[f[2][y]]!=-1
					dfs(x+1,y,g);
				}
			}
			else printf("cannot reach\n");
		}
}
int main(){
	freopen("alpha.in","r",stdin);
	freopen("alpha.out","w",stdout);
	scanf("%d",&n);
	for(int i=0;i<=2;i++) scanf("%s",f[i]+1);
	memset(c2d,-1,sizeof(c2d));
	dfs(0,n,0);
}