@ emming (逃
by t162 @ 2019-02-23 10:24:28
@[垃圾一个](/space/show?uid=85933)
```cpp
#include <cstdio>
#include <cstring>
#include <iostream>
#include <stdlib.h>
using namespace std;
int d[30],n;
char a[30],b[30],c[30],v[91];
bool used[91];
//将n个字母一依次存入d[],同时将v[]清零
void prepare()
{
int q=0;
for(int i=n-1;i>=0;i--)
{
if(v[int(a[i])]!=-1)
{
d[++q]=a[i];
v[int(a[i])]=-1;
}
if(v[int(b[i])]!=-1)
{
d[++q]=b[i];
v[int(b[i])]=-1;
}
if(v[int(c[i])]!=-1)
{
d[++q]=c[i];
v[int(c[i])]=-1;
}
}
}
/*check()只是判断是否可能构成正解,
并不代表得出的achievement一定是正解
还需用ok()验证
*/
bool ok()
{
int carry=0;
for(int i=n-1;i>=0;i--)
{
int x=v[int(a[i])]+v[int(b[i])]+carry;
carry=x/n,x=x%n;
if(x!=v[int(c[i])])
return 0;
}
if(carry==1)//如最高位有进位,return
return 0;
return 1;
}
//每得到一个字母的值,便 check(),方便剪枝
bool check()
{
int i;
for(i=n-1;i>=0;i--)
{
//know a,b,c
if(v[int(a[i])]>-1&&v[int(b[i])]>-1&&v[int(c[i])]>-1)
{
int x=v[int(a[i])]+v[int(b[i])];
if(x%n!=v[int(c[i])]&&(x+1)%n!=v[int(c[i])])
return 0;
}
//know a,b
if(v[int(a[i])]>-1&&v[int(b[i])]>-1&&v[int(c[i])]==-1)
{
int x=v[int(a[i])]+v[int(b[i])];
if(used[x%n]&&used[(x+1)%n])
return 0;
}
//know a,c
if(v[int(a[i])]>-1&&v[int(c[i])]>-1&&v[int(b[i])]==-1)
{
int x1=(v[int(c[i])]-v[int(a[i])]+n)%n;
int x2=(v[int(c[i])]-v[int(a[i])]+n-1)%n;
if(used[x1]&&used[x2])
return 0;
}
//know c,b
if(v[int(b[i])]>-1&&v[int(c[i])]>-1&&v[int(a[i])]==-1)
{
int x1=(v[int(c[i])]-v[int(b[i])]+n)%n;
int x2=(v[int(c[i])]-v[int(b[i])]+n-1)%n;
if(used[x1]&&used[x2])
return 0;
}
}
return 1;
}
void print()
{
int i;
for(i=65;i<64+n;++i)
printf("%d ",v[i]);
printf("%d",v[i]);
exit(0);//搜到直接结束,不浪费time
}
//暴搜出每个字母的值
void dfs(int i)
{
if(i>n)
{
if(ok())
print();
return;
}
int j;
for(j=n-1;j>=0;j--)//从大到小,节约time,因为高位的数一定不大
{
if(used[j]) continue;
v[d[i]]=j,used[j]=1;
if(check())
dfs(i+1);
v[d[i]]=-1;
used[j]=0;
}
}
int main ()
{
scanf ("%d\n",&n);//过滤换行符
scanf("%s%s%s",a,b,c);
prepare();
dfs(1);
}
```
by resftlmuttmotw @ 2019-02-23 10:34:58
@[resftlmuttmotw](/space/show?uid=73992) 我代码哪里错了??还要特判??
by ⚡GG⚡ @ 2019-02-23 10:36:51
@[垃圾一个](/space/show?uid=85933)
我太蒟了 没看出来
by resftlmuttmotw @ 2019-02-23 10:38:25
@[resftlmuttmotw](/space/show?uid=73992) 大佬您怎么能这样说呢?
by ⚡GG⚡ @ 2019-02-23 10:39:25
@[垃圾一个](/space/show?uid=85933)
我帮您找个大佬
@[Panda_hu](/space/show?uid=41319)
by resftlmuttmotw @ 2019-02-23 10:41:07