HDU3699(POJ 3989)A hard Aoshu Problem(暴力模拟dfs)

来源:互联网 发布:朋友圈制作软件 编辑:程序博客网 时间:2024/06/02 13:53

题目链接: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 __int64using 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;}


0 0