You have 4 cards each containing a number from 1 to 9. You need to judge whether they could operated through *
, /
, +
, -
, (
, )
to get the value of 24.
Example 1:
Input: [4, 1, 8, 7] Output: True Explanation: (8-4) * (7-1) = 24
Example 2:
Input: [1, 2, 1, 2] Output: False
Note:
/
represents real division, not integer division. For example, 4 / (1 - 2/3) = 12.-
as a unary operator. For example, with [1, 1, 1, 1]
as input, the expression -1 - 1 - 1 - 1
is not allowed.[1, 2, 1, 2]
, we cannot write this as 12 + 12.列出四个数的全排列,对每一个排列进行所有可能的运算(三个位置的运算符加减乘除有4*4*4=64种可能,插入括号有6种方式),检查运算结果是否为24。
#include
#include
#include
#include
using namespace std;
class Solution {
public:
vector operands;
bool judgePoint24(vector& nums) {
for (int i = 0 ;i < 4; i++)
operands.push_back(nums[i]);
for (int i = 0; i < 24; i++) {
for (int x = 1; x <= 4; x++)
for (int y = 1; y <= 4; y++)
for (int z = 1; z <= 4; z++) {
double left,middle,right,result;
left=compute(x, operands[0], operands[1]);
middle=compute(y, operands[1],operands[2]);
right=compute(z,operands[2], operands[3]);
result=compute(y,left,operands[2]);
result=compute(z,result,operands[3]);
if (fabs(result-24)<0.001) return true;//a?b?c?d
result=compute(y, left,right);
if (fabs(result-24)<0.001) return true;//(a?b)?(c?d)
result=compute(x, operands[0], middle);
result=compute(z, result, operands[3]);//(a?(b?c))?d
if (fabs(result-24)<0.001) return true;
result=compute(z, middle,operands[3]);
result=compute(x, operands[0],result);//a?((b?c)?d)
if (fabs(result-24)<0.001) return true;
result= compute(y,left,right);
if (fabs(result-24)<0.001) return true;//a?b?(c?d)
result=compute(y,operands[1],right);
result=compute(x,operands[0],result);
if (fabs(result-24)<0.001) return true;//a?(b?(c?d))
}
next_permutation(operands.begin(),operands.end());
}
return false;
}
double compute(int oper, double & a, double& b) {
if (oper==1) return a+b;
if (oper==2) return a-b;
if (oper==3) return a*b;
if (oper==4) {
if (b==0) return 0;
return a/b;
}
}
};