题意:
给三个字符串s1,s2,s3,三个字符串的每一个字符都代表着一个数字(0~9),问s1 经过和s2进行加减乘除得到s3,问一共有多少种这
样的情况。
输入:
2 A A A BCD BCD B
输出:
5 72
分析:
直接暴力搜索,将字符串转换成数字,(做法:每次乘10加位数)当然要用 long long 才能存的下,然后枚举加减乘除四种运算,只
要满足要求的,ans++;之后dfs遍历将0到9的数字依次填入字符串组成的数字中,注意填过的数字注意要标记。具体实现看代码。
代码:
#include <cstdio>
#include <cstring>
#include <vector>
#include <algorithm>
#include <map>
using namespace std;
char s1[10],s2[10],s3[10];
long long ans=0;
map<int,int>vis;
int val[5],num[5];
void solve()
{
long long a=0,b=0,c=0;
for(int i=0;s1[i]!=0;i++)
{
int x=s1[i]-'A';
if(!val[x]&&!i&&strlen(s1)>1)
return;
a=a*10+val[x];
}
for(int i=0;s2[i]!=0;i++)
{
int x=s2[i]-'A';
if(!val[x]&&!i&&strlen(s2)>1)
return;
b=b*10+val[x];
}
for(int i=0;s3[i]!=0;i++)
{
int x=s3[i]-'A';
if(!val[x]&&!i&&strlen(s3)>1)
return;
c=c*10+val[x];
}
if(a+b==c)
ans++;
if(a-b==c)
ans++;
if(a*b==c)
ans++;
if(b&&a%b==0)
{
if(a/b==c)
ans++;
}
}
void dfs(int x)
{
if(x==5) //5个字母
{
solve();
return;
}
if(num[x]==0)
dfs(x+1);
else
{
for(int i=0;i<=9;i++)
{
if(vis[i]) //循环
continue;
val[x]=i;
vis[i]=1;
dfs(x+1);
vis[i]=0;
}
}
}
int main()
{
int T;
scanf("%d",&T);
while(T--)
{
ans=0;
vis.clear();
memset(num,0,sizeof(num));
scanf("%s%s%s",s1,s2,s3);
for(int i=0;s1[i]!=0;i++)
num[s1[i]-'A']=1;
for(int i=0;s2[i]!=0;i++)
num[s2[i]-'A']=1;
for(int i=0;s3[i]!=0;i++)
num[s3[i]-'A']=1;
dfs(0);
printf("%I64d\n",ans);
}
return 0;
}