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

題目鏈接: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;
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章