速算24点

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 6946    Accepted Submission(s): 1828

Problem Description

速算24点相信绝大多数人都玩过。就是随机给你四张牌,包括A(1),2,3,4,5,6,7,8,9,10,J(11),Q(12),K(13)。要求只用'+','-','*','/'运算符以及括号改变运算顺序,使得最终运算结果为24(每个数必须且仅能用一次)。游戏很简单,但遇到无解的情况往往让人很郁闷。你的任务就是针对每一组随机产生的四张牌,判断是否有解。我们另外规定,整个计算过程中都不能出现小数。

Input

每组输入数据占一行,给定四张牌。

Output

每一组输入数据对应一行输出。如果有解则输出"Yes",无解则输出"No"。

Sample Input

A 2 3 6 3 3 8 8

Sample Output

Yes No

Author

LL

Source

ACM暑期集训队练习赛(三)

因规模不大,直接暴力枚举了所有情况。

AC代码如下:

//1427 
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
int sum(int a,int b,int c,int d)   //枚举不加括号所有情况
{
    char str[4]={'+','-','*','/'};
    int i,j,k,l,ans=0,n,m,p;
    for(i=0;i<2;i++)
    {
        ans=0;
        if(i==1)
            ans-=a;
        else
            ans+=a;
        n=ans;
        for(j=0;j<4;j++)
        {ans=n;
            if(j==0)
                ans+=b;
            else if(j==1)
                ans-=b;
            else if(j==2)
                ans*=b;
            else
                if(ans%b==0&&b!=0)
                    ans/=b;
                else 
                    continue;
                m=ans;
            for(k=0;k<4;k++)
            {ans=m;
                if(k==0)
                    ans+=c;
                else if(k==1)
                    ans-=c;
                else if(k==2)
                    ans*=c;
                else
                    if(ans%c==0&&c!=0)
                        ans/=c;
                    else 
                        continue;
                    p=ans;
                for(l=0;l<4;l++)
                {ans=p;
                    if(l==0)
                        ans+=d;
                    else if(l==1)
                        ans-=d;
                    else if(l==2)
                        ans*=d;
                    else
                        if(ans%d==0&&d!=0)
                            ans/=d;
                        else 
                            continue;
                    if(ans==24)
                    {
                        //printf("%c%d%c%d%c%d%c%d=%d\n",str[i],a,str[j],b,str[k],c,str[l],d,ans); //输出算式
                        return 1;
                    }
                }
            }
        }
    }
    return 0;
}

int kh(int a,int b,int c,int d)  //枚举加括号的所有情况
{
    char str[4]={'+','-','*','/'};
    int ans,bns,sum,i,j,k,l;
    for(i=0;i<4;i++)
    {
        ans=0;
        if(i==0)
            ans=a+b;
        else if(i==1)
            ans=a-b;
        else if(i==2)
            ans=a*b;
        else 
            if(i==3&&a%b==0)
                ans=a/b;
            else 
                continue;
        for(j=0;j<4;j++)
        {
            bns=0;
            if(j==0)
                bns=c+d;
            else if(j==1)
                bns=c-d;
            else if(j==2)
                bns=c*d;
            else 
                if(j==3&&c%d==0)
                    bns=c/d;
                else 
                    continue;
            for(k=0;k<4;k++)
            {
                sum=0;
                if(k==0)
                    sum=ans+bns;
                else if(k==1)
                    sum=ans-bns;
                else if(k==2)
                    sum=ans*bns;
                else 
                    if(k==3&&bns!=0&&ans%bns==0)
                        sum=ans/bns;
                    else 
                        continue;
                if(sum==24)
                {
                    //printf("(%d%c%d)%c(%d%c%d)=%d\n",a,str[i],b,str[k],c,str[j],d,sum); //输出算式
                    return 1;
                }
            }
        }
    }
    return 0;
}

int main()
{
    int a,b,c,d,i,aa[4];    
    char temp[4][3];
    char aAA[14][3]={"0","A","2","3","4","5","6","7","8","9","10","J","Q","K"};
    while(scanf("%s %s %s %s",temp[0],temp[1],temp[2],temp[3])!=EOF)
    {
        int f=0;
        for(int i=0;i<4;i++)//把牌转换成对应的数字
        {
            for(int j=1;j<=13;j++)
            if(strcmp(temp[i],aAA[j])==0)
            {
                aa[i]=j;
                break;
            }
        }
        
        for(a=0;a<4;a++)        //全排
        {
            if(f==1) break;
            for(b=0;b<4;b++)
            {
                if(f==1) break;
                if(b==a) continue;
                for(c=0;c<4;c++)
                {
                    if(f==1) break;
                    if(c==a||c==b) continue;
                    d=6-a-b-c;
                    if(sum(aa[a],aa[b],aa[c],aa[d])||kh(aa[a],aa[b],aa[c],aa[d]))
                    {
                        printf("Yes\n");
                        f=1;
                        break;
                    }
                }
            }
        }
        
if(f==0) 
printf("No\n");
    }
    return 0;
}
---------------------
作者:yongtaozheng
来源:CSDN
原文:https://blog.csdn.net/Twinkle_sone/article/details/95041176
版权声明:本文为博主原创文章,转载请附上博文链接!

hdu 1427 速算24点【暴力枚举】的更多相关文章

  1. hdu 1427 速算24点

    题目连接 http://acm.hdu.edu.cn/showproblem.php?pid=1427 速算24点 Description 速算24点相信绝大多数人都玩过.就是随机给你四张牌,包括A( ...

  2. hdu 1427 速算24点 dfs暴力搜索

    速算24点 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Problem De ...

  3. HDU 1427 速算24点 (深搜)

    题目链接 Problem Description 速算24点相信绝大多数人都玩过.就是随机给你四张牌,包括A(1),2,3,4,5,6,7,8,9,10,J(11),Q(12),K(13).要求只用' ...

  4. HDU 1427 速算24点【数值型DFS】

    速算24点 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submi ...

  5. 24点游戏&&速算24点(dfs)

    24点游戏 Time Limit: 3000/1000MS (Java/Others)     Memory Limit: 65535/65535KB (Java/Others) Submit Sta ...

  6. Hdu1427 速算24点 2017-01-18 17:26 46人阅读 评论(0) 收藏

    速算24点 Time Limit : 2000/1000ms (Java/Other)   Memory Limit : 65536/32768K (Java/Other) Total Submiss ...

  7. hdu1427之速算24点

    速算24点 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Subm ...

  8. hdu 4082 Hou Yi's secret(暴力枚举)

    Hou Yi's secret Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) ...

  9. HDU - 1248 寒冰王座 数学or暴力枚举

    思路: 1.暴力枚举每种面值的张数,将可以花光的钱记录下来.每次判断n是否能够用光,能则输出0,不能则向更少金额寻找是否有能够花光的.时间复杂度O(n) 2.350 = 200 + 150,买350的 ...

随机推荐

  1. Traefik 2.0 发布了

    Traefik 2.0 发布了,包含了很多不错的行特性 tcp 路由(同时也支持sni 路由) 参考配置 tcp: routers: to-db-1: entrypoints: - web-secur ...

  2. BZOJ2151/洛谷P1792 题解

    若想要深入学习反悔贪心,传送门. Description: 有 \(n\) 个位置,每个位置有一个价值.有 \(m\) 个树苗,将这些树苗种在这些位置上,相邻位置不能都种.求可以得到的最大值或无解信息 ...

  3. 【cf比赛记录】Codeforces Round #601 (Div. 2)

    Codeforces Round #601 (Div. 2) ---- 比赛传送门 周二晚因为身体不适鸽了,补题补题 A // http://codeforces.com/contest/1255/p ...

  4. win10 关闭开机密码

    在运行对话框里输入:netplwiz 控制面板(control)>电源选项>更改计算机休眠时间-选为 从不

  5. Phoenix概述

    Phoenix是Salesforce.com开源的一个项目,可以让开发者在Apache HBase上执行SQL查询. Phoenix查询引擎会将SQL查询转换为一个或多个HBase scan,并编排执 ...

  6. FZU Monthly-201906 获奖名单

    FZU Monthly-201906 获奖名单 冠军: 空缺 一等奖: 陈金杰 S031702334 空缺 二等奖: 黄海东 S031702647 吴宜航 S031702645 蔡煜晖 S111801 ...

  7. [技术博客] 利用Vagrant+virtualbox在windows下进行linux开发

    目录 加速box安装的方法 root账户登录 换源教程 安装rvm 访问rails server RubyMine连接虚拟机上的解释器 作者:庄廓然 在windows下进行linux开发:利用Vagr ...

  8. win10安装ubuntu双系统遇到的问题

    安装过程学习了几个博客 Ubuntu 16.04与Win10双系统双硬盘安装图解:https://www.cnblogs.com/coxiseed/p/9945202.html?tdsourcetag ...

  9. Java编程思想之九 接口

    接口和内部为我们提供了一种将接口与实现分离的更加结构化的方法. 抽象类和抽象方法 创建一个抽象类是希望通过这个通用接口操纵一系列类. Java提供了一个叫做抽象方法的机制,这种方法是不完整的:仅声明而 ...

  10. 微信小程序for循环中传递动态参数

    for循环中的参数,没法传到对应的 js里,所以直接在 wxml页面上跳转 发送参数的 wxml页面 <view class="uploader" wx:for=" ...