爆搜+剪枝
按加法顺序搜索,填每一个字母,然后不合法的时候return 。80分到手。
枚举的时候从n-1~0,90分。
填每一位之前,检查一遍后面所有的位数是否合法,如果后面有A+B==C—而且ABC都填过数了,但是不管进位还是不进位都不会合法的话return 。AC
#include<iostream>
#include<cstdio>
#include<ctime>
#define LL long long
using namespace std;
int n;
char s1[30];
char s2[30];
char s3[30];
int a[105];
int use[105];
bool vs[105];
int val[105];
LL tot;
bool check(int x,int w)
{
int p3=s3[x]-'A'+1;
if(use[p3])
{
if(val[p3]!=(a[x]+w)%n)
return false;
use[p3]++;
a[x]+=w;
if(a[x]>=n)
{
a[x+1]+=a[x]/n;
a[x]%=n;
}
return true;
}
else
{
if(vs[(a[x]+w)%n])
return false;
a[x]+=w;
if(a[x]>=n)
{
a[x+1]+=a[x]/n;
a[x]%=n;
}
use[p3]=1;
val[p3]=a[x];
return true;
}
}
bool ans;
void print()
{
for(int i=1;i<=n;i++)
cout<<i<<" "<<use[i]<<" "<<val[i]<<endl;
}
int T1,T2;
bool ret(int x)
{
int p=s1[x]-'A'+1;
int q=s2[x]-'A'+1;
int p3=s3[x]-'A'+1;
if(use[p]&&use[q]&&use[p3])
{
int w=(val[p]+val[q])%n;
if(w<val[p3]-1) return false;
if(w>val[p3]&&(w!=n-1||val[p3]!=0))
return false;
}
return true;
}
void dfs(int x)
{
if(x>n||ans)
{
if(!ans)
{
ans=1;
for(int i=1;i<=n;i++)
{
printf("%d",val[i]);
if(i!=n) printf(" ");
}
}
return ;
}
for(int i=x+1;i<=n;i++)
if(!ret(i)) return;
int p=s1[x]-'A'+1;
int q=s2[x]-'A'+1;
int p3=s3[x]-'A'+1;
if(use[p])
{
if(use[q])
{
int w=val[p]+val[q];
if(check(x,w))
{
dfs(x+1);
a[x]+=a[x+1]*n;
a[x]-=w;
a[x+1]=0;
use[p3]--;
}
}
else
{
for(int i=n-1;i>=0;i--)
if(!vs[i])
{
vs[i]=1;
use[q]++;
val[q]=i;
int w=val[p]+val[q];
if(check(x,w))
{
dfs(x+1);
a[x]+=a[x+1]*n;
a[x]-=w;
a[x+1]=0;
use[p3]--;
}
vs[i]=0;
use[q]--;
}
}
}
else if(use[q])
{
for(int i=n-1;i>=0;i--)
if(!vs[i])
{
vs[i]=1;
use[p]++;
val[p]=i;
int w=val[p]+val[q];
if(check(x,w))
{
dfs(x+1);
a[x]+=a[x+1]*n;
a[x]-=w;
a[x+1]=0;
use[p3]--;
}
vs[i]=0;
use[p]--;
}
}
else
{
for(int i=n-1;i>=0;i--)
{
if(!vs[i])
{
vs[i]=1;
use[p]++;
val[p]=i;
if(!use[q])
for(int j=0;j<n;j++)
{
if(!vs[j])
{
vs[j]=1;
use[q]++;
val[q]=j;
int w=val[p]+val[q];
if(check(x,w))
{
dfs(x+1);
a[x]+=a[x+1]*n;
a[x]-=w;
a[x+1]=0;
use[p3]--;
}
vs[j]=0;
use[q]--;
}
}
else
{
int w=val[p]+val[q];
if(check(x,w))
{
dfs(x+1);
a[x]+=a[x+1]*n;
a[x]-=w;
a[x+1]=0;
use[p3]--;
}
}
vs[i]=0;
use[p]--;
}
}
}
}
int main()
{
scanf("%d",&n);
scanf("%s%s%s",s1+1,s2+1,s3+1);
for(int i=1;i<=n/2;i++)
{
swap(s1[i],s1[n-i+1]);
swap(s2[i],s2[n-i+1]);
swap(s3[i],s3[n-i+1]);
}
dfs(1);
return 0;
}