dfs从右往左枚举每一列
dfs0从上到下枚举每一列上的数字
#include<bits/stdc++.h>
using namespace std;
int n,zm[30];
string s[4];
bool num[30];
void print(){
for(int i=1;i<=n;i++) printf("%d ",zm[i]);
exit(0);
}
void dfs0(int step,int carry,int h);
void dfs(int step,int carry);
void dfs0(int step,int carry,int h){
if(h==4){
int val1=zm[int(s[1][n-step-1])-'A'+1];
int val2=zm[int(s[2][n-step-1])-'A'+1];
int val3=zm[int(s[3][n-step-1])-'A'+1];
if((val1+val2+carry)%n==val3) dfs(step+1,(val1+val2+carry)/n);
return;
}
int z=int(s[h][n-step-1])-'A'+1;
if(zm[z]!=-1) dfs0(step,carry,h+1);//字母已经确定便跳到下一行
if(zm[z]==-1){
for(int i=0;i<n;i++){
if(num[i]==1) continue;
num[i]=1;
zm[z]=i;
dfs0(step,carry,h+1);
zm[z]=-1;
num[i]=0;
}
}
}
void dfs(int step,int carry){
if(step==n&&carry==0){
print();
return;
}
dfs0(step,carry,1);
}
int main(){
cin>>n;
for(int i=0;i<=n;i++) zm[i]=-1;
cin>>s[1]>>s[2]>>s[3];
dfs(0,0);
return 0;
}