POJ 3548 Restoring the digits

暴力搜索。注意题目说每个字母对应的数字不同,这句话表明最多只有10个字母,所以暴力DFS绝对不会TLE。

#include<cstdio>

#include<cstring>

#include<cmath>

#include<algorithm>

using namespace std;



char s[1000],t[1000];

char cun[1000];

int C[1000];

int ans[1000];

int tot;

int flag;

int rt[15];



void DFS(int x)

{

    int i;

    if(x==tot)

    {

        t[0]='\0';

        strcpy(t,s);

        for(i=0;t[i];i++)

            if(t[i]>='A'&&t[i]<='Z')

                t[i]=ans[C[t[i]]]+'0';

        int num1=0;

        int num2=0;

        int num3=0;

        int num=0;

        int jia=0;

        int jian=0;

        for(i=0;t[i];i++)

        {

            if(t[i]>='0'&&t[i]<='9') num=num*10+t[i]-'0';

            if(t[i]=='+') num1=num,num=0,jia=1;

            if(t[i]=='-') num1=num,num=0,jian=1;

            if(t[i]=='=') num2=num,num=0;

        }

        num3=num,num=0;

        if(jia==1)

            if(num1+num2==num3)

                flag=1;

        if(jian==1)

            if(num1-num2==num3)

                flag=1;

        return;

    }

    for(i=0;i<=9;i++)

    {

        if(rt[i]==0)

        {

            ans[x]=i;

            rt[i]=1;

            DFS(x+1);

            if(flag) return;

            rt[i]=0;

        }

    }

}



int main()

{

    int i;

    while(~scanf("%s",s))

    {

    memset(C,0,sizeof(C));

    tot=1;flag=0;

    for(i=0;s[i];i++)

    {

        if(s[i]>='A'&&s[i]<='Z')

        {

            if(C[s[i]]==0)

            {

                C[s[i]]=tot;

                cun[tot]=s[i];

                tot++;

            }

        }

    }

    memset(rt,0,sizeof(rt));

    DFS(1);

    int flag[1000];

    int shuzi[1000];

    memset(flag,0,sizeof(flag));

    for(i=1;i<tot;i++)

    {

        flag[cun[i]]=1;

        shuzi[cun[i]]=ans[i];

    }

    for(i='A';i<='Z';i++)

        if(flag[i])

            printf("%c %d\n",i,shuzi[i]);

    }

    return 0;

}

 

你可能感兴趣的:(REST)