ZZNU - OJ - 2080 : A+B or A-B【暴力枚举】

2080 : A+B or A-B(点击左侧标题进入zznu原题页面)

时间限制:1 Sec 内存限制:0 MiB
提交:8 答案正确:3

提交 状态 讨论区

题目描述

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

简单分析:Each letter represents a different number ,要求不重复枚举;Notice that the leading 0 is not legal.  要求组合的数前面没有空0.其余想说的话都在代码注释里:

#include<iostream>
#include<stdio.h>
#include<algorithm>
#include<string.h>
#include<stdlib.h>
#include<math.h>
using namespace std;
#define N 19
const int inf=0x3f3f3f3f;
int num[4][N],l1,l2,l3; //num[x][y] 表示第x个字符串对应的第y个字符大小
int have[6];

int legal(int s1,int s2,int s3) //合法情况只有 是个位数或者 位数等于表示的字符数
{
     int len1,len2,len3;
     if(s1==0)len1=1;
     else len1=(int)log10(s1)+1;
     if(s2==0)len2=1;
     else len2=(int)log10(s2)+1;
    if(s3==0)len3=1;
    else len3=(int)log10(s3)+1;

    if(l1>1&&len1<l1)
        return 0;
    if(l2>1&&len2<l2)
        return 0;
    if(l3>1&&len3<l3)
        return 0;
    return 1;
}
int repeat(int a,int b,int c,int d,int e){
    if(a==b||a==c||a==d||a==e||
       b==c||b==d||b==e||
       c==d||c==e||
       d==e)
        return 1;
    else
        return 0;
}
int fact()
{
    int s1,s2,s3,ans=0;
    int i[10],j,k;  //i[1~5]依次枚举ABCDE五个数!
    for(i[1]=0;i[1]<=9;i[1]++){
        for(i[2]=0;i[2]<=9;i[2]++){
            for(i[3]=0;i[3]<=9;i[3]++){
                for(i[4]=0;i[4]<=9;i[4]++){
                    for(i[5]=0;i[5]<=9;i[5]++){
                        s1=s2=s3=0;
                                    //.Each letter represents a different number
                        if(repeat(i[1],i[2],i[3],i[4],i[5])==1)  //去重
                            continue;

                        for(j=1;j<=l1;j++) //枚举num【1】【】的每位进行组合!
                            s1=s1*10+ i[num[1][j]];
                        for(j=1;j<=l2;j++) //枚举num【2】【】的每位进行组合!
                            s2=s2*10+ i[num[2][j]];
                        for(j=1;j<=l3;j++) //枚举num【3】【】的每位进行组合!
                            s3=s3*10+ i[num[3][j]];

                        if(legal(s1,s2,s3)==1){  ///Notice that the leading 0 is not legal.
                                //下面两行为调试代码,解封可以看到搜索过程!
                         //   if(s1+s2==s3||s1-s2==s3||s1*s2==s3||(s2!=0&&s1%s2==0&&s1/s2==s3))
                         //      printf("**%d)****%d %d %d\n",ans,s1,s2,s3);
                            if(s1+s2==s3)ans++;
                            if(s1*s2==s3)ans++;
                            if(s1-s2==s3)ans++;
                            if(s2!=0&&s1%s2==0&&s1/s2==s3)ans++;  //整数必要要用s1%s2==0,不然3/2==1!!
                        }

                        for(k=1;k<=5;k++)//直接结束不必要的循环!!比如只有ABC,而没有DE,需要少跑两重循环
                            if(!have[k])i[k]=10;
                    }
                }
            }
        }
    }
    return ans;
}
int main()
{
    int i,j,k,m,n;
    char str[N];
    while(scanf("%s",str)!=EOF)
    {
        memset(have,0,sizeof(have));
        l1=strlen(str);
        for(i=0;i<strlen(str);i++){
            num[1][i+1]=str[i]-‘A‘+1;
            have[num[1][i+1]]=1;
        }

        scanf("%s",str);
        l2=strlen(str);
        for(i=0;i<strlen(str);i++){
            num[2][i+1]=str[i]-‘A‘+1;
            have[num[2][i+1]]=1;
        }

        scanf("%s",str);
        l3=strlen(str);
        for(i=0;i<strlen(str);i++){
            num[3][i+1]=str[i]-‘A‘+1;
            have[num[3][i+1]]=1;
        }
     //  printf("%d\n",legal(1,1,0));
       printf("%d\n",fact());
    }

    return 0;
}

/*样例输入
A A A
AB BA AB
A B C
样例输出
5
0
72
*/

时间: 2024-08-01 13:24:29

ZZNU - OJ - 2080 : A+B or A-B【暴力枚举】的相关文章

【ACM】----杭电oj 2080

夹角有多大II Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 7888    Accepted Submission(s): 3971 Problem Description 这次xhd面临的问题是这样的:在一个平面内有两个点,求两个点分别和原点的连线的夹角的大小. 注:夹角的范围[0,180],两个点不会在圆心出现. Input 输

CSU OJ PID=1514: Packs 超大背包问题,折半枚举+二分查找。

1514: Packs Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 61  Solved: 4[Submit][Status][Web Board] Description Give you n packs, each of it has a value v and a weight w. Now you should find some packs, and the total of these value is max, total of

九度OJ 1375 陈博的完美主义 (枚举,细心细心)

题目1375:陈博的完美主义(25分) 时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:1158 解决:287 题目描述: 上一回合大家都知道,在JOBDU团队里,陈博是最讲平均主义的人,对数字十分敏感.事实上,他还是个数字完美主义者.例如看到N个数字的时候,从1到N的每个数都需要在其中出现且仅出现一次,否则他就觉得这个数字序列不完美.后来,我明白了:这是排列! 对于一个整数序列d1, d2, d3 ... dn,你是否能够算出至少改变其中的几个数,才能把他们变成从1到N的一个排列?例

sdut oj 2372 Annoying painting tool (【暴力枚举测试】1Y )

Annoying painting tool 题目描述 Maybe you wonder what an annoying painting tool is? First of all, the painting tool we speak of supports only black and white. Therefore, a picture consists of a rectangular area of pixels, which are either black or white.

BestCoder Round #50 (div.1) 1002 Run (HDU OJ 5365) 暴力枚举+正多边形判定

题目:Click here 题意:给你n个点,有多少个正多边形(3,4,5,6). 分析:整点是不能构成正五边形和正三边形和正六边形的,所以只需暴力枚举四个点判断是否是正四边形即可. 1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <algorithm> 5 #include <cmath> 6 #define power(x) ((x)*(x))

swust oj 763--校门外的树 Plus(暴力枚举)

题目链接:http://acm.swust.edu.cn/problem/0763/ Time limit(ms): 1000 Memory limit(kb): 65535 西南某科技大学的校门外有N排树,每一排树的长度可能不同.每一棵树都用字符作了一个标记. 现在由于学校修建教师公寓,需要在每排树中砍一段连续的树.要求是在每一排树中砍掉的那一段树标记序列都相同. 例如第1排:ABCD,第2排BCDFF,第3排:BRCD,那么我们就可以在每一排树中砍掉CD.请注意下面测试数据的第二组,我们可以

Comet OJ - Contest #5

Comet OJ - Contest #5 总有一天,我会拿掉给\(dyj\)的小裙子的. A 显然 \(ans = min(cnt_1/3,cnt_4/2,cnt5)\) B 我们可以感性理解一下,最大的满足条件的\(x\)不会太大 因为当\(x\)越来越大时\(f(x)\)的增长速度比\(x\)的增长速度慢得多 其实可以证明,最大的满足的\(x\)不会超过\(100\) 因为没有任何一个三位数的各位之和大于等于\(50\) 所以我们就直接预处理\(1-99\)所有的合法的 暴力枚举即可 其实

ACM训练方案-POJ题目分类

ACM训练方案-POJ题目分类 博客分类: 算法 ACM online Judge 中国: 浙江大学(ZJU):http://acm.zju.edu.cn/ 北京大学(PKU):http://acm.pku.edu.cn/JudgeOnline/ 杭州电子科技大学(HDU):http://acm.hdu.edu.cn/ 中国科技大学(USTC):http://acm.ustc.edu.cn/ 北京航天航空大学(BUAA)http://acm.buaa.edu.cn/oj/index.php 南京

[合集]国庆休闲补题

Hrbust - 1846 题意:序列每个格子允许放O和X,求长度为n的序列中至少存放m个连续的O的方案数 容斥+dp 设\(dp[i]\)为长度为\(i\)时的合法方案数 转移的个数来自于上一个状态的合法序列后面接上O和X,既\(dp[i-1]*2\) 也有可能来自于本来不合法的方案,转移后就合法了,那先固定一部分状态,因为转移后才合法,所以假定序列中[i-m+1,i]全部为O,那么前面就可以为所欲为,有\(2^{i-m}\)个状态,但\(2^{i-m}\)中会有合法方案的存在,因此需要减去已