luogu_1092 虫食算
#include <iostream> #include <cstring> #include <cstdio> using namespace std; const int N=30; int n,s1[4][N],num[N]; char s[4][N]; bool vis[N]; void dfs(int x,int y,int t){ if(x==0){ if(t==0){ for(int i=1;i<=n;i++)printf("%d ",num[i]); puts(""); exit(0); } return; } for(int i=x-1;i>=1;i--){ int w1=num[s1[1][i]],w2=num[s1[2][i]],w3=num[s1[3][i]]; if(w1==-1 || w2==-1 || w3==-1)continue; if((w1+w2)%n!=w3 && (w1+w2+1)%n!=w3)return; } if(num[s1[y][x]]==-1){ for(int i=n-1;i>=0;i--){ if(!vis[i]){ if(y!=3){ num[s1[y][x]]=i; vis[i]=1; dfs(x,y+1,t); num[s1[y][x]]=-1; vis[i]=0; } else{ int w=num[s1[1][x]]+num[s1[2][x]]+t; if(w%n!=i)continue; vis[i]=1; num[s1[3][x]]=i; dfs(x-1,1,w/n); vis[i]=0; num[s1[3][x]]=-1; } } } } else { if(y!=3)dfs(x,y+1,t); else { int w=num[s1[1][x]]+num[s1[2][x]]+t; if(w%n!=num[s1[3][x]])return; dfs(x-1,1,w/n); } } } int main(){ scanf("%d",&n); for(int i=1;i<=3;i++)scanf("%s",s[i]+1); for(int i=1;i<=n;i++)s1[1][i]=s[1][i]-'A'+1; for(int i=1;i<=n;i++)s1[2][i]=s[2][i]-'A'+1; for(int i=1;i<=n;i++)s1[3][i]=s[3][i]-'A'+1; memset(num,0xff,sizeof(num)); memset(vis,0,sizeof(vis)); dfs(n,1,0); return 0; }