求帮忙看下

P1092 [NOIP2004 提高组] 虫食算

```cpp #include<iostream> #include<cstdio> #include<cstring> #include<algorithm> using namespace std; int n,ans[101]; char a[101],b[101],c[101]; bool vis[101]; void dfs(int x,int jw){ if(!x){ if(jw)return; for(int i=1;i<=n;i++){ printf("%d ",ans[i]); } exit(0); } if(ans[a[x]-'A'+1]==-1 and ans[b[x]-'A'+1]==-1){ if(a[x]==b[x]){ for(int i=0;i<n;i++){ if(!vis[i]){ bool flag=1; vis[i]=1; ans[a[x]-'A'+1]=i; if(ans[c[x]-'A'+1]!=-1 and (i+i+jw)%n!=ans[c[x]-'A'+1]){ vis[i]=0,ans[a[x]-'A'+1]=-1; continue; } if(vis[(i+i+jw)%n] and ans[c[x]-'A'+1]==-1){ vis[i]=0,ans[a[x]-'A'+1]=-1; continue; } if(ans[c[x]-'A'+1]==-1)ans[c[x]-'A'+1]=(i+i+jw)%n,flag=0,vis[(i+i+jw)%n]=1; dfs(x-1,(i+i+jw)/n); if(!flag)ans[c[x]-'A'+1]=-1,vis[(i+i+jw)%n]=0; ans[i]=-1; vis[i]=0; } } } else { for(int i=0;i<n;i++){ if(!vis[i]){ for(int j=0;j<n;j++){ if(vis[j] or i==j)continue; bool flag=1; vis[i]=vis[j]=1; ans[a[x]-'A'+1]=i; ans[b[x]-'A'+1]=j; if(ans[c[x]-'A'+1]!=-1 and (i+j+jw)%n!=ans[c[x]-'A'+1]){ ans[a[x]-'A'+1]=ans[b[x]-'A'+1]=-1; vis[i]=vis[j]=0; continue; } if(vis[(i+j+jw)%n] and ans[c[x]-'A'+1]==-1){ ans[a[x]-'A'+1]=ans[b[x]-'A'+1]=-1; vis[i]=vis[j]=0; continue; } if(ans[c[x]-'A'+1]==-1)ans[c[x]-'A'+1]=(i+j+jw)%n,flag=0,vis[(i+j+jw)%n]=1; dfs(x-1,(i+j+jw)/n); if(!flag)ans[c[x]-'A'+1]=-1,vis[(i+j+jw)%n]=0; ans[a[x]-'A'+1]=ans[b[x]-'A'+1]=-1; vis[i]=vis[j]=0; } } } } } else if(ans[a[x]-'A'+1]==-1){ for(int i=0;i<n;i++){ if(!vis[i]){ bool flag=1; vis[i]=1; ans[a[x]-'A'+1]=i; if(ans[c[x]-'A'+1]!=-1 and (i+ans[b[x]-'A'+1]+jw)%n!=ans[c[x]-'A'+1]){ ans[a[x]-'A'+1]=-1; vis[i]=0; continue; } if(vis[(i+ans[b[x]-'A'+1]+jw)%n] and ans[c[x]-'A'+1]==-1){ ans[a[x]-'A'+1]=-1; vis[i]=0; continue; } if(ans[c[x]-'A'+1]==-1)ans[c[x]-'A'+1]=(i+ans[b[x]-'A'+1]+jw)%n,flag=0,vis[(i+ans[b[x]-'A'+1]+jw)%n]=1; dfs(x-1,(i+ans[b[x]-'A'+1]+jw)/n); if(!flag)ans[c[x]-'A'+1]=-1,vis[(i+ans[b[x]-'A'+1]+jw)%n]=0; ans[a[x]-'A'+1]=-1; vis[i]=0; } } } else if(ans[b[x]-'A'+1]==-1){ for(int i=0;i<n;i++){ if(!vis[i]){ bool flag=1; vis[i]=1; ans[b[x]-'A'+1]=i; if(ans[c[x]-'A'+1]!=-1 and (i+ans[a[x]-'A'+1]+jw)%n!=ans[c[x]-'A'+1]){ ans[b[x]-'A'+1]=-1; vis[i]=0; continue; } if(vis[(i+ans[a[x]-'A'+1]+jw)%n] and ans[c[x]-'A'+1]==-1){ ans[b[x]-'A'+1]=-1; vis[i]=0; continue; } if(ans[c[x]-'A'+1]==-1)ans[c[x]-'A'+1]=(i+ans[a[x]-'A'+1]+jw)%n,vis[(i+ans[a[x]-'A'+1]+jw)%n]=1,flag=0; dfs(x-1,(i+ans[a[x]-'A'+1]+jw)/n); if(!flag)ans[c[x]-'A'+1]=-1,vis[(i+ans[a[x]-'A'+1]+jw)%n]=0; ans[b[x]-'A'+1]=-1; vis[i]=0; } } }else { bool flag=1; int xx=ans[b[x]-'A'+1],yy=ans[a[x]-'A'+1]; if(ans[c[x]-'A'+1]!=-1){ if((xx+yy+jw)%n!=ans[c[x]-'A'+1])return; } else { if(vis[(xx+yy+jw)%n])return; ans[c[x]-'A'+1]=(xx+yy+jw)%n; vis[(xx+yy+jw)%n]=1; flag=0; } dfs(x-1,(xx+yy+jw)/n); if(!flag)ans[c[x]-'A'+1]=-1,vis[(xx+yy+jw)%n]=0; } } int main(){ memset(ans,-1,sizeof(ans)); scanf("%d",&n); scanf("%s%s%s",a+1,b+1,c+1); dfs(n,0); return 0; } ```
by ezoiHY @ 2018-10-29 13:24:28


$\sf I\color{#f8f8f9}\colorbox{#f8f8f9}{WApD3}\color{black}AK IOI$ I[ ](https://www.luogu.org/space/show?uid=106955)AK IOI
by Sunrule @ 2018-10-29 13:42:10


|