代码中nex数组表示下一个的进位,(因为stl里有一个next,用next会报错,所以就换成了nex)nu布尔数组表示哪个数用没用过,init是初始化,总而言之就可以把它看为离散化+翻转
那个hh代表的是换行
#include<bits/stdc++.h>
using namespace std;
int a[30],b[30],c[30],nex[30];
int num[30],n;
string sta,stb,stc;
bool nu[30];
void init(){
for(int i=1;i<=n;i++){
a[i]=(sta[n-i]-'A')+1;
b[i]=(stb[n-i]-'A')+1;
c[i]=(stc[n-i]-'A')+1;
}return;
}void dfs(int nowa){
for(int i=1;i<nowa;i++){
if(num[b[i]]==-1||num[c[i]]==-1){
continue;
}else{
int t=num[a[i]]+num[b[i]];
if((t+1)%n!=num[c[i]]&&(t)%n!=num[c[i]]){
return;
}
}
}if(nowa==n+1){
for(int i=1;i<=n;i++){
int nowa=num[a[i]],nowb=num[b[i]],nowc=num[c[i]],nexup=(nowa+nowb+nex[i])/n;
nex[i+1]=nexup;
if(nexup==1&&i==n) return;
else{
if((nowa+nowb+nex[i])%n!=nowc){
return;
}
}
}for(int i=1;i<=n;i++){
cout<<num[i]<<" ";
}exit(0);
}else{
for(int i=0;i<=n-1;i++){
if(!nu[i]){
nu[i]=true;
num[a[nowa]]=i;
dfs(nowa+1);
num[a[nowa]]=-1;
nu[i]=false;
}
}
}
}int main(){
cin>>n;
char hh=getchar();
getline(cin,sta);
getline(cin,stb);
getline(cin,stc);
for(int i=n-1;i>=0;i--){
num[i]=-1;
}init();
dfs(1);
return 0;
}