#include<cstdio>
#include<iostream>
#include<cstring>
#include<cstdlib>
#define MAXN 90
using namespace std;
int n,abc[MAXN],p;
char a[MAXN],b[MAXN],c[MAXN],word[MAXN];
bool used[MAXN];
void print()
{
for(
int i=
'A';i<
'A'+n-
1;i++)
printf(
"%d ",abc[i]);
printf(
"%d\n",abc[
'A'+n-
1]);
}
bool check()
{
int jw=
0;
for(
int i=n-
1;i>=
0;i--)
{
int x=abc[(
int)a[i]],y=abc[(
int)b[i]],z=abc[(
int)c[i]];
if(x!=-
1&&y!=-
1&&z!=-
1)
{
if(jw==-
1)
{
if(((x+y)%n==z)||(x+y+
1)%n==z)
jw=(x+y)/n;
else
return 0;
}
else
{
if((x+y+jw)%n==z)
jw=(x+y+jw)/n;
else
return 0;
}
}
else if(x!=-
1&&y!=-
1)
{
int sum=x+y,f=-
1;
if(
sum>=n){
sum-=n;f=
1;}
else f=
0;
if(jw!=
1&&!used[
sum]){jw=f;
continue;}
sum=x+y+
1;
if(
sum>=n){
sum-=n;f=
1;}
else f=
0;
if(!used[
sum]){jw=f;
continue;}
return 0;
}
else if(x!=-
1&&z!=-
1)
{
int sum=z-x,f=-
1;
if(
sum<
0){
sum+=n;f=
1;}
else f=
0;
if(jw!=
1&&!used[
sum]){jw=f;
continue;}
sum=z-x-
1;
if(
sum<
0){
sum+=n;f=
1;}
else f=
0;
if(
sum>=
0&&!used[
sum]){jw=f;
continue;}
return 0;
}
else if(y!=-
1&&z!=-
1)
{
int sum=z-y,f=-
1;
if(
sum<
0){
sum+=n;f=
1;}
else f=
0;
if(jw!=
1&&!used[
sum]){jw=f;
continue;}
sum=z-y-
1;
if(
sum<
0){
sum+=n;f=
1;}
else f=
0;
if(
sum>=
0&&!used[
sum]){jw=f;
continue;}
return 0;
}
else
jw=-
1;
}
if(jw!=
1)
return 1;
return 0;
}
void dfs(
int x)
{
if(x==n)
{
print();
exit(
0);
}
for(
int i=
0;i<n;i++)
if(!used[i])
{
used[i]=
1;
abc[(
int)word[x]]=i;
if(!check())
{
used[i]=
0;
abc[(
int)word[x]]=-
1;
continue;
}
dfs(x+
1);
used[i]=
0;
abc[(
int)word[x]]=-
1;
}
}
int main()
{
cin>>n>>a>>b>>c;
for(
int i=n-
1;i>=
0;i--)
{
if(!used[(
int)a[i]])
{
used[(
int)a[i]]=
1;
word[p++]=a[i];
}
if(!used[(
int)b[i]])
{
used[(
int)b[i]]=
1;
word[p++]=b[i];
}
if(!used[(
int)c[i]])
{
used[(
int)c[i]]=
1;
word[p++]=c[i];
}
}
memset(used,
0,sizeof(used));
memset(abc,-
1,sizeof(abc));
dfs(
0);
return 0;
}
另一种做法:做法2
转载请注明原文地址: https://ju.6miu.com/read-659793.html