码迷,mamicode.com
首页 > 其他好文 > 详细

ZZNU2080 A+B or A-B(暴力)

时间:2017-12-09 22:26:56      阅读:216      评论:0      收藏:0      [点我收藏+]

标签:har   str   using   play   roc   change   bsp   print   until   

2080 : A+B or A-B
时间限制:1 Sec 内存限制:0 MiB
提交:15 答案正确:5
题目描述
Give you three strings s1, s2 and s3. These strings contain only capital letters A,B,C,D,E. The letters that appear in the string represent a number from 0 to 9.Each letter represents a different number.Now we want to know how many four equations these strings can form. In other words, you need to calculate how many ways that s1+s2=s3
or s1-s2=s3 or s1*s2=s3 or s1/s2=s3. Notice that the leading 0 is not legal.
输入
Multiple sample input until the end of the file
The three strings represent s1, s2, s3, and their length will not exceed 5
输出
The total number of ans
样例输入
复制
A A A
样例输出
复制
5
 
题意:给你三个字符串 s1,s2,s3 它们仅由大写字母 A B C D E 组成
它们的长度均不超过5
每个字母代表数字0-9中一个不同数。
有多少方法可以使得这三个字符串代表的数满足以下任意一个式子
s1+s2=s3 s1*s2=s3 s1-s2=s3 s1/s2=s3
要注意前导零不合法
 
提供几组测试样例
ABC ABC ABC
0
ABB AC AC
1
AB BA AB
0
A B C
72
 
个人写了接近两个小时 WA4次
技术分享图片
#include <cstdio>
#include <cstring>
#include <algorithm>

using namespace std ;

int Cole[6],cnt;

bool vis[10],exist[6];

int ChangeToNum(char s[])///该函数把匹配好数字的字符串转化为数
{
    int num=0;

    for(int i=0; i<strlen(s); i++)
    {
        num*=10;
        num+=Cole[s[i]-A];
    }
    return num;
}

void operation(char s1[],char s2[],char s3[])
{
    int a,b,c;
    a=ChangeToNum(s1);
    b=ChangeToNum(s2);
    c=ChangeToNum(s3);
    if(a+b==c)
    {
        cnt++;
    }
    if(a-b==c)
    {
        cnt++;
    }

    if(a*b==c)
    {
        cnt++;
    }
    if(b!=0&&c*b==a)
    {
        cnt++;
    }
}

bool ZeroCheak(char s1[],char s2[],char s3[])
{
    ///该函数用于检查前导零
    if(Cole[s1[0]-A]==0&&strlen(s1)>1)
    {
        return false;
    }
    if(Cole[s2[0]-A]==0&&strlen(s2)>1)
    {
        return false;
    }
    if(Cole[s3[0]-A]==0&&strlen(s3)>1)
    {
        return false;
    }

    return true;
}

void CoTheLetter(int idex,char s1[],char s2[],char s3[],char str[],int k)
{
    /*
    *通过递归给str中出现的字母匹配数字
    *匹配完所有存在的字母后
    *调用“ZeroCheak函数”检查这种匹配方式会不会使某一个字符串出现前导零
    *如果不出现前导零就调用“operation函数”更新cnt的值
    */
    if(idex>=k)
    {
        if(ZeroCheak(s1,s2,s3))
           operation(s1, s2, s3);
        return;
    }
    for(int i=0; i<10; i++)
    {
        if(!vis[i])
        {
            Cole[str[idex]-A]=i;
            vis[i]=1;
            CoTheLetter(idex+1,s1,s2,s3,str,k);
            vis[i]=0;
        }
    }
}

void CheakExist(char s1[],char s2[],char s3[],char str[],int &k)
{
    /*
    *这个函数用于检查真正出现的字母
    *把真正出现的字母存入str
    *接下来我们给每个字母匹配对应数字的时候
    *只需要给str中确定存在的字母匹配就可以了
    */
    k=0;
    memset(exist,false,sizeof(exist));
    memset(str,\0,sizeof(str));
    for(int i=0; i<strlen(s1); i++)
    {
        if(!exist[s1[i]-A])
        {
            exist[s1[i]-A]=1;
            str[k++]=s1[i];
        }
    }
    for(int i=0; i<strlen(s2); i++)
    {
        if(!exist[s2[i]-A])
        {
            exist[s2[i]-A]=1;
            str[k++]=s2[i];
        }
    }
    for(int i=0; i<strlen(s3); i++)
    {
        if(!exist[s3[i]-A])
        {
            exist[s3[i]-A]=1;
            str[k++]=s3[i];
        }
    }
}

int main()
{
    int k;
    char s1[6],s2[6],s3[6],str[6];
    while(~scanf("%s %s %s",s1,s2,s3))
    {
        cnt=0;///该变量用于更新方法的个数
        CheakExist(s1,s2,s3,str,k);///检查三个字符串中存在哪些字母
        memset(vis,0,sizeof(vis));
        CoTheLetter(0,s1,s2,s3,str,k);///匹配数字 
        printf("%d\n",cnt);
    }
    return 0;
}
View Code

 

技术分享图片

ZZNU2080 A+B or A-B(暴力)

标签:har   str   using   play   roc   change   bsp   print   until   

原文地址:http://www.cnblogs.com/zhangzehua/p/8012548.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!