解题思路
刚开始按yzy神犇给的方法写,就是每次要把能算出来的都算出来,结果因为太菜写挂了。。后来直接爆搜水过。。
#include<iostream> #include<cstdio> #include<cstring> #include<cmath> #include<cstdlib> using namespace std; const int MAXN=40; int n,a[MAXN],cnt; char s[4][MAXN]; bool vis[MAXN],flag; bool check(){ for(register int j=n;j;j--){ if(a[s[1][j]-'A']<0 || a[s[3][j]-'A']<0 || a[s[2][j]-'A']<0) continue; if((a[s[1][j]-'A']+a[s[2][j]-'A'])%n!=a[s[3][j]-'A'] && (a[s[1][j]-'A']+a[s[2][j]-'A']+1)%n!=a[s[3][j]-'A']) return false; } return true; } bool pd(){ int pre=0; for(register int j=n;j;j--){ if((a[s[1][j]-'A']+a[s[2][j]-'A']+pre)%n!=a[s[3][j]-'A']) return false; pre=(a[s[1][j]-'A']+a[s[2][j]-'A']+pre)/n; } return pre?false:true; } void dfs(int x,int now){ if(now==4) {now=1;x--;if(x==0) {if(pd()) flag=1;return;}} if(a[s[now][x]-'A']>=0) {dfs(x,now+1);return;} for(register int i=n-1;i>=0;i--){ if(vis[i]) continue; vis[i]=1;a[s[now][x]-'A']=i; if(!check()) {vis[i]=0;a[s[now][x]-'A']=-1;continue;} dfs(x,now+1);if(flag) return;vis[i]=0;a[s[now][x]-'A']=-1; } } int main(){ memset(a,-1,sizeof(a)); scanf("%d%s%s%s",&n,s[1]+1,s[2]+1,s[3]+1); dfs(n,1); for(register int i=0;i<n;i++) printf("%d ",a[i]); return 0; } /* 4 BADC CBDA DCCC */