#LeetCode 679: 24 Game 解题与思考
题目描述
就是24点啦,给你四个数字,判断能否得出24点
思路
没得讲,直接枚举
看起来真的挺荒谬:不过仔细想想,4个数字全排列24种可能,3个符号64种可能,对称重复除以2,总共也不超过24 × 64 ÷2 = 768种可能;考虑加法和乘法的交换,情况还要更少一点
算法
枚举也没什么算法可言了
代码
#include <iostream>
#include <vector>
#include <math.h>
using namespace std;
class Solution {
bool jp2(double a, double b) {
return (abs(a + b - 24) < 1e-10) || (abs(a - b - 24) < 1e-10) || (abs(a * b - 24) < 1e-10) || (b != 0 && (abs(a / b - 24) < 1e-10)) || (abs(b - a - 24)<1e-10) || (a != 0 && (abs(b / a - 24)<1e-10));
}
bool jp3(double a, double b, double c) {
return jp2(a + b, c) || jp2(a - b, c) || jp2(a * b, c) || (b != 0 && jp2(a / b, c)) || jp2(b - a, c) || (a != 0 && jp2(b / a, c)) \
|| jp2(c + b, a) || jp2(c - b, a) || jp2(c * b, a) || (b != 0 && jp2(c / b, a)) || jp2(b - c, a) || (c != 0 && jp2(b / c, a)) \
|| jp2(a + c, b) || jp2(a - c, b) || jp2(a * c, b) || (c != 0 && jp2(a / c, b)) || jp2(c - a, b) || (a != 0 && jp2(c / a, b));
}
public:
bool judgePoint24(vector<int>& nums) {
double a = nums[0], b = nums[1], c = nums[2], d = nums[3];
return jp3(a + b, c, d) || jp3(a - b, c, d) || jp3(a * b, c, d) || (b != 0 && jp3(a / b, c, d)) || jp3(b - a, c, d) || (a != 0 && jp3(b / a, c, d)) \
|| jp3(c + b, a, d) || jp3(c - b, a, d) || jp3(c * b, a, d) || (b != 0 && jp3(c / b, a, d)) || jp3(b - c, a, d) || (c != 0 && jp3(b / c, a, d)) \
|| jp3(a + c, b, d) || jp3(a - c, b, d) || jp3(a * c, b, d) || (c != 0 && jp3(a / c, b, d)) || jp3(c - a, b, d) || (a != 0 && jp3(c / a, b, d)) \
|| jp3(a + d, c, b) || jp3(a - d, c, b) || jp3(a * d, c, b) || (d != 0 && jp3(a / d, c, b)) || jp3(d - a, c, b) || (a != 0 && jp3(d / a, c, b)) \
|| jp3(d + b, a, c) || jp3(d - b, a, c) || jp3(d * b, a, c) || (b != 0 && jp3(d / b, a, c)) || jp3(b - d, a, c) || (d != 0 && jp3(b / d, a, c)) \
|| jp3(d + c, b, a) || jp3(d - c, b, a) || jp3(d * c, b, a) || (c != 0 && jp3(d / c, b, a)) || jp3(c - d, b, a) || (d != 0 && jp3(c / d, b, a));
}
};
思考
一开始我还想着怎么去更快地得到解答,但是想了想反正也不需要给出如何得到24点,只需要判断,所以就枚举了