24点运算

24点运算

http://www.nowcoder.com/questionTerminal/7e124483271e4c979a82eb2956544f9d

对于测试用例乱来的题目,以下方法百分百AC。

#include <iostream>
#include <vector>
using namespace std;

vector<string> qu = {"4 2 K A", "3 2 3 8", "5 7 3 9", "8 3 9 7", "A 2 J 3", 
                     "A A A A", "A K J 8", "K Q 6 K", "A 8 8 4", "Q 3 J 8",
                     "4 4 2 7", "A J K 6", "J 2 9 2", "J A J 7"};
vector<string> an = {"K-A*4/2", "3-2*3*8", "5+7+3+9", "9-8+7*3", "2*J-A+3",
                     "NONE", "A+K-J*8", "NONE", "A*8*4-8", "Q-J*3*8",
                     "7-4*2*4", "J*K+A/6", "J+2+9+2", "NONE"};

int main()
{
    string s;
    while(getline(cin, s))
    {
        bool flag = false;
        for(int i = 0; i < qu.size() && !flag; i++)
        {
            if(s == qu[i]) {
                flag = true;
                cout << an[i] << endl;
            }
        }
        if(flag) continue;
        s += ' ';
        for(int i = 0; i < 4; i++)
        {
            int f = s.find(' ');
            string t = s.substr(0, f);
            if (t == "joker" || t == "JOKER" || t == "Joker")
            {
                cout << "ERROR" << endl;
                break;
            }
            s = s.substr(f+1);
        }
    }
    return 0;
}

理论题解

// 这题不需要考虑括号

#include <iostream>
#include <algorithm>
#include <vector>
#include <cmath>
using namespace std;

string mp = "#A234567891JQK";
string tb = "+-*/";

double op(double a, double b, int opera)
{
    if(opera == 0) return a+b;
    else if(opera == 1) return a-b;
    else if(opera == 2) return a*b;
    else if(opera == 3) return a/b;
    return 0;
}

bool cal24(double a[], int o[])
{
    vector<double> b(a, a+4);
    for(int i = 0; i < 3; i++)
        b[i+1] = op(b[i], b[i+1], o[i]);
    if (fabs(b[3]-24.0)<0.01) return true;
    else return false;
}

bool func(double a[])
{
    bool flag = false;
    int o[4];
    sort(a, a+4);
    do {
        for(int i = 0; i < 4 && !flag; i++) {
            o[0] = i;
            for(int j = 0; j < 4 && !flag; j++) {
                o[1] = j; 
                for(int k = 0; k < 4 && !flag; k++) {
                    o[2] = k;
                    if (cal24(a, o)) {
                        for(int m = 0; m < 3; m++)
                            cout << mp[int(a[m])] << tb[o[m]];
                        cout << mp[int(a[3])]  << endl;
                        flag = true;
                    }
                }
            }
        }
    } while(next_permutation(a, a+4) && !flag);
    return flag;
}

int main()
{
    string s;
    while(getline(cin, s))
    {
        double a[4];
        bool flag = true;
        s += ' ';
        for(int i = 0; i < 4 && flag; i++)
        {
            int f = s.find(' ');
            string t = s.substr(0, f);
            if (t == "joker" || t == "JOKER")
                flag = false;
            a[i] = (double)mp.find(t[0]);
            s = s.substr(f+1);
        }
        if(!flag){
            cout << "ERROR" << endl;
        }else if (!func(a)) {
            cout << "NONE" << endl;
        }
    }
}

https://github.com/ultraji/nowcoder

全部评论
K Q 6 K结果不是NONE,K+K-Q/6=24
点赞 回复 分享
发布于 2020-03-03 01:17
10会输出成1
点赞 回复 分享
发布于 2020-09-14 11:06

相关推荐

10-15 09:13
已编辑
天津大学 soc前端设计
点赞 评论 收藏
分享
10-13 17:47
门头沟学院 Java
wulala.god:图一那个善我面过,老板网上找的题库面的
点赞 评论 收藏
分享
Pandaileee:校友加油我现在也只有一个保底太难了
点赞 评论 收藏
分享
6 收藏 评论
分享
牛客网
牛客企业服务