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]='';
        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
",i,shuzi[i]);
    }
    return 0;
}
原文地址:https://www.cnblogs.com/zufezzt/p/4677115.html