题解 | #24点运算#

24点运算

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

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

bool cal(vector<double>a, int op[]) {
    int j = 0;
    for (int i = 0; i < 3; i++) {
        if (op[i] == 1) {
            a[i + 1] = a[i] + a[i + 1];
        } else if (op[i] == 2) {
            a[i + 1] = a[i] - a[i + 1];
        } else if (op[i] == 3) {
            a[i + 1] = a[i] * a[i + 1];
        } else if (op[i] == 4) {
            a[i + 1] = a[i] / a[i + 1];
        }
    }
    if (a[3] == 24) {
        return true;
    } else {
        return false;
    }
}

int main() {
    int op[4];
    string card[13] = {"2", "3", "4", "5", "6", "7", "8", "9", "10", "J", "Q", "K", "A" };
    int dic[13] = {2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 1};
    // while (getline(cin, s)) {
    // string ss[4], temp[4];
    // ss[0] = s.substr(0, s.find(' '));
    // temp[0] = s.substr(s.find(' ') + 1);
    // ss[1] = temp[0].substr(0, temp[0].find(' '));
    // temp[1] = temp[0].substr(temp[0].find(' ') + 1);
    // ss[2] = temp[1].substr(0, temp[1].find(' '));
    // temp[2] = temp[1].substr(temp[1].find(' ') + 1);
    // ss[3] = temp[2].substr(0, temp[2].find(' '));
// }
    vector<string>s(4);//vector数组一定要初始化长度大小。
    cin >> s[0] >> s[1] >> s[2] >> s[3];
    for (int i = 0; i < 4; i++) {
        if (s[i] == "joker" || s[i] == "JOKER") {
            cout << "ERROR";
            return 0;
        }
    }
    vector<double>a(4, 0);
    for (int i = 0; i < 4; i++) {
        for (int j = 0; j < 13; j++) {
            if (s[i] == card[j]) {
                a[i] = dic[j];
            }
        }
    }
    sort(a.begin(), a.end());
    bool flag = false;
    do {
        for (int i = 1; i <= 4; i++) {
            for (int j = 1; j <= 4; j++) {
                for (int k = 1; k <= 4; k++) {
                    for (int z = 1; z <= 4; z++) { //用例中可以运算符可以重复
                        op[0] = i;
                        op[1] = j;
                        op[2] = k;
                        op[3] = z;
                        flag = cal(a, op);
                        if (flag == true) {
                            break;
                        }
                    }
                    if (flag == true) {
                        break;
                    }
                }
                if (flag == true) {
                    break;
                }
            }
            if (flag == true) {
                break;
            }
        }
        if (flag == true) {
            break;
        }
    } while (next_permutation(a.begin(), a.end()));

    if (flag == true) {
        for (int i = 0; i < 4; i++) {
            for (int j = 0; j < 13; j++) {
                if (a[i] == dic[j]) {
                    s[i] = card[j];
                }
            }
        }
        char opp[4];
        for (int i = 0; i < 3; i++) {
            if (op[i] == 1) {
                opp[i] = '+';
            } else if (op[i] == 2) {
                opp[i] = '-';
            } else if (op[i] == 3) {
                opp[i] = '*';
            } else if (op[i] == 4) {
                opp[i] = '/';
            }
        }
        cout << s[0] << opp[0] << s[1] << opp[1] << s[2] << opp[2] << s[3];
    } else {
        cout << "NONE";
    }

    return 0;
}
// 64 位输出请用 printf("%lld")

全部评论

相关推荐

02-12 00:59
已编辑
哈尔滨工业大学 产品经理
华为 软件开发岗 20.6*16薪 本科
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务