题解 | 24点游戏算法

24点游戏算法

https://www.nowcoder.com/practice/fbc417f314f745b1978fc751a54ac8cb?tpId=37&rp=1&sourceUrl=%2Fexam%2Foj%2Fta%3FtpId%3D37&difficulty=3&judgeStatus=&tags=&title=&gioEnter=menu

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

char ops[4] = {'+', '-', '*', '/'};
//两数计算
double cal(double db1, double db2, char op) {
    double result;
    switch (op) {
        case '+':
            result = db1 + db2;
            break;
        case '-':
            result = db1 - db2;
            break;
        case '*':
            result = db1 * db2;
            break;
        case '/':
            result = db1 / db2;
            break;
    };
    return result;
};
int main() {
    double num[4];
    cin >> num[0] >> num[1] >> num[2] >> num[3];
    sort(num, num + 4); //初始化为最小排序
    do                  //生成所有排列
    {//顺序计算,不加括号
        for (int i = 0; i < 4; i++) {
            double res;
            if (i == 3 && num[1] == 0)continue;
            else res = cal(num[0], num[1], ops[i]);
            for (int j = 0; j < 4; j++) {
                if (j == 3 && num[2] == 0)continue;
                else res = cal(res, num[2], ops[j]);
                for (int k = 0; k < 4; k++) {
                    if (k == 3 && num[3] == 0)continue;
                    else res = cal(res, num[3], ops[k]);
                    if (res == 24) {
                        cout << "true";
                        return 0;
                    }
                }
            }
        }
        //加括号,先计算num[1]和num[2]
        for (int i = 0; i < 4; i++) {
            double val12;
            double res;
            if (i == 3 && num[2] == 0)continue;
            else val12 = cal(num[1], num[2], ops[i]);
            //再计算val12和num[3]
            for (int j = 0; j < 4; j++) {
                if (j == 3 && num[3] == 0)continue;
                else res = cal(val12, num[3], ops[j]);
                for (int k = 0; k < 4; k++) {
                    if (k == 3 && res == 0)continue;
                    else res = cal(num[0], res, ops[k]);
                    if (res == 24) {
                        cout << "true";
                        return 0;
                    }
                }
            }
            //再顺序计算
            for (int j = 0; j < 4; j++) {
                if (j == 3 && val12 == 0)continue;
                else res = cal(num[0], val12,  ops[j]);
                for (int k = 0; k < 4; k++) {
                    if (k == 3 && num[3] == 0)continue;
                    else res = cal(res, num[3], ops[k]);
                    if (res == 24) {
                        cout << "true";
                        return 0;
                    }
                }
            }

        }
        //加括号,先计算num[2]和num[3]
        for (int i = 0; i < 4; i++) {
            double val23;
            double res;
            if (i == 3 && num[3] == 0)continue;
            else val23 = cal(num[2], num[3], ops[i]);
            //再计算val23和num[1]
            for (int j = 0; j < 4; j++) {
                if (j == 3 && num[1] == 0)continue;
                else res = cal(val23, num[1], ops[j]);
                for (int k = 0; k < 4; k++) {
                    if (k == 3 && num[0] == 0)continue;
                    else res = cal(res, num[0], ops[k]);
                    if (res == 24) {
                        cout << "true";
                        return 0;
                    }
                }
            }
            //再顺序计算
            for (int j = 0; j < 4; j++) {
                if (j == 3 && num[1] == 0)continue;
                else res = cal(num[0], num[1], ops[j]);
                for (int k = 0; k < 4; k++) {
                    if (k == 3 && val23 == 0)continue;
                    else res = cal(res, val23, ops[k]);
                    if (res == 24) {
                        cout << "true";
                        return 0;
                    }
                }
            }

        }

    } while (next_permutation(num,num + 4)); //next_permutation() 按字典序生成下一个排列,直到最大排列(如 [4,3,2,1])后返回 false。
    cout << "false";
    return 0;
}

#转行#
全部评论

相关推荐

12-14 11:43
黑龙江大学 Java
用微笑面对困难:确实比较烂,可以这么修改:加上大学的qs排名,然后大学简介要写一些,然后硕士大学加大加粗,科研经历第一句话都写上在复旦大学时,主要负责xxxx,简历左上角把学校logo写上,建议用复旦大学的简历模板
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

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