思路:
这道题我们考虑搜索
我们枚举每一个数字代表着什么值,而最难得的就是判断是否合法
我们肯定从低位到高位算,首先如果当前这一位上三个值都被枚举过了,那我们就可以直接进行加法进位,然而如果当前这一位上有一个值没有被枚举过,我们就可以设一个标记为-1
然后如果在设为-1之后又有一位上三个值都被枚举过了的话,那么我们就分成是否被进位讨论,如果没有进位,那么a+b的最低位就要等于c,如果没有进位,那么a+b+1的最低位就要等于c,如果两个条件都不满足,着表明判断失败,直接返回
😁😁😁
c o d e code code
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int n, m;
string s[4];
char ss[100];
bool v[100], b[100];
int num[100];
bool check()
{
int x=0;
for(int i=n-1; i>=0; i--)
{
int a=num[s[1][i]-'A'];
int b=num[s[2][i]-'A'];
int c=num[s[3][i]-'A'];
if(a!=-1&&b!=-1&&c!=-1)
{
if(x!=-1)
{
if((a+b+x)%n!=c)
return 0;
if(i==0&&a+b+x>=n)
return 0;
x=(a+b+x)/n;
}
else
{
if((a+b)%n!=c&&(a+b+1)%n!=c)
return 0;
if(i==0&&a+b+x>=n)
return 0;
}
}
else
x=-1;
}
return 1;
}
bool dfs(int x)
{
if(x>n)
return 1;
for(int i=0; i<n; i++)
{
if(b[i]==0)
{
b[i]=1;
num[ss[x]-'A']=i;
if(check()&&dfs(x+1))
return 1;
b[i]=0;
num[ss[x]-'A']=-1;
}
}
return 0;
}
int main()
{
memset(num, -1, sizeof(num));
scanf("%d", &n);
for(int i=1; i<=3; i++)
cin>>s[i];
for(int j=n-1; j>=0; j--)
for(int i=1; i<=3; i++)
{
if(v[s[i][j]-'A']==0)
{
v[s[i][j]-'A']=1;
ss[++m]=s[i][j];
}
}
dfs(1);
for(int i=0; i<n; i++)
printf("%d ", num[i]);
return 0;
}