• hihoCoder1304:24点


    时间限制:10000ms
    单点时限:1000ms
    内存限制:256MB

    描述

    周末,小Hi和小Ho都在家待着。

    在收拾完房间时,小Ho偶然发现了一副扑克,于是两人考虑用这副扑克来打发时间。

    小Ho:玩点什么好呢?

    小Hi:两个人啊,不如来玩24点怎么样,不靠运气就靠实力的游戏。

    小Ho:好啊,好啊。

    <经过若干局游戏之后>

    小Ho:小Hi,你说如果要写个程序来玩24点会不会很复杂啊?

    小Hi:让我想想。

    <过了几分钟>

    小Hi:我知道了!其实很简单嘛。

    提示:24点

    输入

    第1行:1个正整数, t,表示数据组数,2≤t≤100。

    第2..t+1行:4个正整数, a,b,c,d,1≤a,b,c,d≤10。

    输出

    第1..t行:每行一个字符串,第i行表示第i组能否计算出24点。若能够输出"Yes",否则输出"No"。

    样例输入
    2
    5 5 5 1
    9 9 9 9
    样例输出
    Yes
    No

    #include <iostream>
    #include <string.h>
    #include <math.h>
    using namespace std;
    const double EPS=1.0e-2;
    bool used[4];
    int number[4];
    int oneNumber[4];
    char ops[3];
    char opType[6]={'+','-','*','/','#','$'};
    
    double cal(double x,double y,char op)
    {
        switch(op)
        {
            case '+':return x+y;
            case '-':return x-y;
            case '*':return x*y;
            case '/':return x/y;
            case '#':return y-x;
            case '$':return y/x;
        }
    }
    double calType1()
    {
        double x=cal((double)oneNumber[0],(double)oneNumber[1],ops[0]);
        double y=cal(x,(double)oneNumber[2],ops[1]);
        return cal(y,(double)oneNumber[3],ops[2]);
    }
    double calType2()
    {
        double x=cal((double)oneNumber[0],(double)oneNumber[1],ops[0]);
        double y=cal((double)oneNumber[2],(double)oneNumber[3],ops[2]);
        return cal(x,y,ops[1]);
    }
    bool makeOperation(int dep)
    {
        if(dep==3)
        {
            if(fabs(calType1()-24.0)<EPS)
            {
                return true;
            }
            if(fabs(calType2()-24.0)<EPS)
            {
                return true;
            }
            return false;
        }
        for(int i=0;i<6;i++)
        {
            ops[dep]=opType[i];
            if(makeOperation(dep+1))
            {
                return true;
            }
        }
        return false;
    }
    
    bool makeNumber(int dep)
    {
        if(dep==4)
        {
            return makeOperation(0);
        }
        for(int i=0;i<4;i++)
        {
            if(!used[i])
            {
                used[i]=true;//注意不是number[i] 
                oneNumber[dep]=number[i];
                if(makeNumber(dep+1))
                {
                    return true;
                }
                used[i]=false;
            }
        }
        return false;
    }
    int main()
    {
        int T;
        cin>>T;
        while(T--)
        {
            for(int i=0;i<4;i++)
            {
                cin>>number[i];
            }
            memset(used,false,sizeof(used));
            if(makeNumber(0))
            {
                cout<<"Yes"<<endl;
            }
            else
            {
                cout<<"No"<<endl;
            }
        }
        return 0;
    }
  • 相关阅读:
    Java 多线程同步的五种方法
    MySQL中的内连接、左连接、右连接、全连接、交叉连接
    java中线程安全和非线程安全的集合
    hashCode和equal
    MySQL中char、varchar和nvarchar的区别
    MySQL存储引擎
    String在内存中如何存储(Java)
    String、StringBuffer、StringBuilder区别
    MySQL中的事务
    gbk、utf-8、utf8mb4区别
  • 原文地址:https://www.cnblogs.com/program-ccc/p/5724614.html
Copyright © 2020-2023  润新知