题解 | #24点运算#

24点运算

https://www.nowcoder.com/practice/7e124483271e4c979a82eb2956544f9d

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

vector<string> a(4);
vector<int> arr;
vector<char> op = { '+', '-', '*', '/' };
vector<vector<char>> all;
// a数组存储牌面字符串
// arr数组是用来存储我们输入的四位数字的
// 我们的op数组是我们的四个符号位的一个数组
// 我们这个表达式里面一共是需要三个符号的
// 我们的这个all就是我们四个选项选三个然后排列组合的所有的可能

int getvalue(string s){ //根据输入的字符串首字母输出对应值
    switch(s[0]){
        case '3': return 3;
        case '4': return 4;
        case '5': return 5;
        case '6': return 6;
        case '7': return 7;
        case '8': return 8;
        case '9': return 9;
        case '1': return 10; //用1代替10
        case 'J': return 11;
        case 'Q': return 12;
        case 'K': return 13;
        case 'A': return 1;
        case '2': return 2;
    }
    return 0;
}
string getcard(int value){ //根据输入值转变成牌面字符串
    switch(value){
        case 3: return "3";
        case 4: return "4";
        case 5: return "5";
        case 6: return "6";
        case 7: return "7";
        case 8: return "8";
        case 9: return "9";
        case 10: return "10";
        case 11: return "J";
        case 12: return "Q";
        case 13: return "K";
        case 1: return "A";
        case 2: return "2";
    }
    return "NOCARD";
}
void init()
{
    for (auto& it1 : op) { 
        // it1代表的是我们第一个的符号位是什么
        for (auto& it2 : op) {
            // it2代表的是我们第二个的符号是什么
            for (auto& it3 : op) {
                // it3代表的是我们第三个符号位是什么
                vector<char> tmp(3);
                // 这里我们开辟的tmp是我们临时的一个存储三个符号位的数组
                tmp[0] = it1, tmp[1] = it2, tmp[2] = it3;
                // 我们将我们枚举出来的符号位放到这个数组里面
                all.push_back(tmp);
                // 然后将我们的可能塞入我们的这个all的数组中
            }
        }
    }
}

// 这个是用来计算值的,判断我们的符号然后进行一个运算
int cal(int a, int b, char op)
{
    switch (op) {
    case '+':
        return a + b;
    case '-':
        return a - b;
    case '*':
        return a * b;
    case '/':
        return a / b;
    }
    return 0;
}

void solve()
{
    sort(arr.begin(), arr.end());
    // 因为我们的c++内的全排列函数要求是要从小到大的数组,所以我们排一下序
    do {
        for (auto &it : all) {
            // 遍历所有的符号集的所有可能
            int res = arr[0];
            // 因为我们有四个数字,但是只有三个符号,所以我们先把答案设置为第一个数字
            int index = 0;
            // 这个是我们符号数组的下标
            for (int i = 1; i <= 3; i++)
                res = cal(res, arr[i], it[index++]);
            // 计算我们当前这个符号集下的答案会是多少
            if (res == 24) {
                cout << getcard(arr[0]) << it[0]
                     << getcard(arr[1]) << it[1]
                     << getcard(arr[2]) << it[2]
                     << getcard(arr[3]);
                return; 
            }
            // 如果已经是等于了24,那么我们可以不用管其他的了,直接就是可以把他输出,然后退出即可
        }
    } while (next_permutation(arr.begin(), arr.end()));
    // 这个是我们执行了一个全排列
    cout << "NONE";
    // 执行完了所有的都没有答案,我们输出NONE
}

signed main()
{
    init();
    while (cin >> a[0] >> a[1] >> a[2] >> a[3]) {
        for (auto x : a)
        {
            if (x == "joker" || x == "JOKER")
            {
                cout << "ERROR";//有大小王直接输出ERROR并退出
                return 0;
            }
        }
        for (auto x : a)
        {
            arr.push_back(getvalue(x));//字符串向量转成int向量
        }
        solve();
    }
    return 0;
}

全部评论

相关推荐

昨天 16:08
门头沟学院 运营
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务