虫食算
题目
解析
当然了,这题可以用高斯消元做,但是暴搜不香吗?
友情提示:本人代码存在适当压行,仅有26行,请谨慎使用
考虑进位,不难发现进位最多只有1,于是根据这样剪一下枝,就从
O
(
n
!
)
O(n!)
O(n!)变成了
O
(
可
过
)
O(可过)
O(可过)
code:
#include<cstdio>
#include<cstring>
#include<cstdlib>
using namespace std;
int n,a[30],b[30],c[30],d[30],e[30],tot;
char s1[30],s2[30],s3[30];
bool v[30];
inline void dfs(int x)
{
if(d[a[0]]+d[b[0]]>=n)return;
for(register int i=n-1;i>=0;--i)if(d[a[i]]!=-1&&d[b[i]]!=-1&&d[c[i]]!=-1&&(d[a[i]]+d[b[i]])%n!=d[c[i]]&&(d[a[i]]+d[b[i]]+1)%n!=d[c[i]])return;
if(x==n)
{
for(register int i=n-1,j=0;i>=0;j=(d[a[i]]+d[b[i--]]+j)/n)if((d[a[i]]+d[b[i]]+j)%n!=d[c[i]])return;
for(register int i=0;i<n;++i)printf("%d ",d[i]);exit(0);
}
for(register int i=n-1;i>=0;--i)if(!v[i])d[e[x]]=i,v[i]=1,dfs(x+1),d[e[x]]=-1,v[i]=0;
}
int main()
{
scanf("%d%s%s%s",&n,s1,s2,s3);
for(register int i=n-1;i>=0;--i)d[i]=-1,v[a[i]=s1[i]-'A']||(v[e[tot++]=a[i]]=1),v[b[i]=s2[i]-'A']||(v[e[tot++]=b[i]]=1),v[c[i]=s3[i]-'A']||(v[e[tot++]=c[i]]=1);
for(register int i=0;i<n;++i)v[i]=0;
dfs(0);
return 0;
}