• 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;
    }
  • 相关阅读:
    Oozie — What Why and How
    git 用户手册
    整理笔记 C语言
    第一次理解通用链表
    C++ 通用队列类
    懂了这些,你才真正懂了C
    简单键盘驱动
    简述进程间通信方式
    几何原本
    GSP几何画板简介
  • 原文地址:https://www.cnblogs.com/zufezzt/p/4677115.html
Copyright © 2020-2023  润新知