题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3699
http://poj.org/problem?id=3989
题意:给你3个字符串(由小于等于8个大写字母组成)s1,s2,s3,每种字母用不同的数字代替,求满足表达式s1 (运算符) s2 = s3的式子的个数。
AC代码:
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#include <stack>
#include <queue>
#include <map>
#include <set>
#include <vector>
#include <cstdlib>
#include <string>
#include <cmath>
#define ll __int64
using namespace std;
char s1[10],s2[10],s3[10] ;
int flag[30],num[10],len1,len2,len3,zi;
ll Ans;
void getans()
{
ll a,b,c,t;
a=b=c=0;
int i;
for(i=0;s1[i];i++)
{
t=num[flag[s1[i]-'A']];
if(!i&&!t&&len1>1)
{
return ;
}
a=a*10+t;
}
for(i=0;s2[i];i++)
{
t=num[flag[s2[i]-'A']];
if(!i&&!t&&len2>1)
{
return ;
}
b=b*10+t;
}
for(i=0;s3[i];i++)
{
t=num[flag[s3[i]-'A']];
if(!i&&!t&&len3>1)
{
return ;
}
c=c*10+t;
}
if(a+b==c)
{
Ans++;
// printf("%I64d + %I64d %I64d\n",a,b,c);
}
if(a-b==c)
{
Ans++;
// printf("%I64d - %I64d %I64d\n",a,b,c);
}
if(a*b==c)
{
Ans++;
// printf("%I64d * %I64d %I64d\n",a,b,c);
}
if(b&&a%b==0&&a/b==c)
{
Ans++;
// printf("%I64d / %I64d %I64d\n",a,b,c);
}
}
void dfs(int n,int m)
{
int i;
if(n==zi)
{
getans();
return;
}
for(i=0;i<=9;i++)
{
if((m&(1<<i))==0)//循环
{
num[n]=i;
dfs(n+1,m|(1<<i));
}
}
}
int main()
{
int t,i,j,n;
scanf("%d",&t);
while(t--)
{
Ans=0;
zi=0;
scanf("%s%s%s",s1,s2,s3);
memset(flag,-1,sizeof(flag));
len1=strlen(s1);
len2=strlen(s2);
len3=strlen(s3);
for(i=0;i<len1;i++)
{
n=s1[i]-'A';
if(flag[n]==-1)
{
flag[n]=zi;
zi++;
}
}
for(i=0;i<len2;i++)
{
n=s2[i]-'A';
if(flag[n]==-1)
{
flag[n]=zi;
zi++;
}
}
for(i=0;i<len3;i++)
{
n=s3[i]-'A';
if(flag[n]==-1)
{
flag[n]=zi;
zi++;
}
}
dfs(0,0);
printf("%I64d\n",Ans);
}
return 0;
}