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