描述

给出4个1-10的数字,通过加减乘除运算,得到数字为24就算胜利,除法指实数除法运算,运算符仅允许出现在两个数字之间,本题对数字选取顺序无要求,但每个数字仅允许使用一次,且需考虑括号运算
此题允许数字重复,如3 3 4 4为合法输入,此输入一共有两个3,但是每个数字只允许使用一次,则运算过程中两个3都被选取并进行对应的计算操作。

输入描述:

读入4个[1,10]的整数,数字允许重复,测试用例保证无异常数字。

输出描述:

对于每组案例,输出一行表示能否得到24点,能输出true,不能输出false

示例1

输入:
7 2 1 10
复制
输出:
true


解题思路:
1)题目只会给四个数,运算符仅允许出现在两个数之间,故四个数之间总共会有三个运算符;
2)本题对数字顺序无要求,所以每种排序都需要考虑,此处可以轮询C++全排列库函数的结果
next_permutation(nums.begin(), nums.end())
3)将四种运算封装为函数op,op的入参是两个操作数及操作符;
4)遍历四个数字之间的三个运算符,每个运算符都有四种可能,故此处使用了4*4*4的循环遍历,每两个数运算的结果再跟下一个数运算,知道运算结果为24;
5)除法需要特别注意,需要考虑除数为0、以及不能整除的情况
if (num2 != 0 && (num1 % num2 == 0)) {
   res = num1 / num2;
 } else {
   res = 0;
 }


#include<iostream>
#include<vector>
#include<algorithm>
#include <cmath>
using namespace std;
int op(int num1, int num2, int flag) {
    int res = 0;
    switch (flag) {
        case 1:
            {
                res = num1 + num2;
                break;
            }
            case 2:
            {
                res = num1 - num2;
                break;
            }
            case 3:
            {
                res = num1 * num2;
                break;
            }
            case 4:
            {
                if (num2 != 0 && (num1 % num2 == 0)) {
                    res = num1 / num2;
                } else {
                    res = 0;
                }
                
                break;
            }
    }
    return res;
}
// nums 原始数组
// require 运算需要达到的结果值
bool func(vector<int> &nums, int require) {
    int flag[4] = {1,2,3,4}; //分别对应 + - * /
    sort(nums.begin(), nums.end());
    do {
        for (int i = 0; i < 4; i++) {
          for (int j = 0; j < 4; j++) {
            for (int k = 0; k < 4; k++) {
                int res = op(nums[0], nums[1], flag[i]);
                res =  op(res, nums[2], flag[j]);
                res =  op(res, nums[3], flag[k]);
                if (res == require) {
                    /*cout << i << ", " << j << ", " << k << endl;
                    cout << res << endl;
                    for (int i = 0; i < 4; i++) {
                            cout << nums[i];
                     }*/
                    return true;
                }
            }
          }
        }
    }while(next_permutation(nums.begin(), nums.end()));
    
    return false;
}

int main()
{
    int res = false;
    vector<int> num(4, 0);
    for (int i = 0; i < 4; i++) {
        cin >> num[i];
    }
    if (func(num,  24)) {
        res = true;
    }
    if (res) cout << "true" << endl;
    else cout << "false" << endl;
    return 0;
}