题解 | #24点运算#

24点运算

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

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

int str2num(string str) {
    int result = -1;
    if (str == "joker" || str == "JOKER") {
        return -1;
    }
    if (str == "10") {
        return 10;
    }
    if (str[0] >= '2' && str[0] <= '9') {
        result = str[0] - '0';
    } else {
        if (str[0] == 'J') {
            result = 11;
        } else if (str[0] == 'Q') {
            result = 12;
        } else if (str[0] == 'K') {
            result = 13;
        } else if (str[0] == 'A') {
            result = 1;
        }
    }
    return result;
}

bool dfs(const vector<int>& nums, vector<char> caculate, vector<char>& res,
         int num, vector<bool> numUsed, vector<int> resNum, vector<int>& res2) {
    if (num == 24 && numUsed[0] && numUsed[1] && numUsed[2] && numUsed[3]) {
        res = caculate;
        res2 = resNum;
        return true;
    } else if (num != 24 && numUsed[0] && numUsed[1] && numUsed[2] && numUsed[3]) {
        return false;
    } else {
        for (int k = 0; k < 4; k++) {
            if (numUsed[k] == false) {
                numUsed[k] = true;
                resNum.push_back(nums[k]);
                for (int j = 0; j <= 3; j++) {
                    switch (j) {
                        case 0:
                            caculate.push_back('+');
                            if (dfs(nums, caculate, res, num + nums[k], numUsed, resNum, res2)) {
                                return true;
                            }
                            caculate.pop_back();
                            break;
                        case 1:
                            caculate.push_back('-');
                            if (dfs(nums, caculate, res, num - nums[k], numUsed, resNum, res2)) {
                                return true;
                            }
                            caculate.pop_back();
                            break;
                        case 2:
                            caculate.push_back('*');
                            if (dfs(nums, caculate, res, num * nums[k], numUsed, resNum, res2)) {
                                return true;
                            }
                            caculate.pop_back();
                            break;
                        case 3:
                            caculate.push_back('/');
                            if (dfs(nums, caculate, res, num / nums[k], numUsed, resNum, res2)) {
                                return true;
                            }
                            caculate.pop_back();
                            break;
                    }
                }
                numUsed[k] = false;
                resNum.pop_back();
            }
        }
    }
    return false;
}

int main() {
    string str;
    getline(cin, str);
    istringstream is(str);
    string word;
    vector<int> nums;
    bool noJoker = true;
    while (is >> word) {
        if (str2num(word) == -1) {
            noJoker = false;
        }
        nums.push_back(str2num(word));
    }
    vector<char> caculate;
    vector<char> res;
    vector<int> resNum;
    vector<int> res2;
    vector<bool> used(4, false);
    bool flag = false;
    if (noJoker) {
        for (int i = 0; i < 4; i++) {
            used[i] = true;
            resNum.push_back(nums[i]);
            if (dfs(nums, caculate, res, nums[i], used, resNum, res2)) {
                flag = true;
            }
            resNum.pop_back();
            used[i] = false;
        }
        if (flag) {
            for (auto& x : res2) {
                if (x >= 2 && x <= 10) {
                    cout << x;
                } else {
                    switch (x) {
                        case 1:
                            cout << "A";
                            break;
                        case 11:
                            cout << "J";
                            break;
                        case 12:
                            cout << "Q";
                            break;
                        case 13:
                            cout << "K";
                            break;
                    }
                }
                if (!res.empty()) {
                    cout << *res.begin();
                    res.erase(res.begin());
                }
            }
        } else {
            cout << "NONE" << endl;
        }
    } else {
        cout << "ERROR" << endl;
    }
}

与HJ67的解法几乎一致,只不过要存储结果数据且触发是整数除法

有个坑,它虽然讲“没有括号”,但是计算元素的位置可以调换,所以依然需要遍历全排列

全部评论

相关推荐

Twilight_mu:经典我朋友XXXX起手,这是那种经典的不知道目前行情搁那儿胡编乱造瞎指导的中年人,不用理这种**
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

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