题目描述:
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:
- The division operator
/
represents real division, not integer division. For example, 4 / (1 - 2/3) = 12. - Every operation done is between two numbers. In particular, we cannot use
-
as a unary operator. For example, with[1, 1, 1, 1]
as input, the expression-1 - 1 - 1 - 1
is not allowed. - You cannot concatenate numbers together. For example, if the input is
[1, 2, 1, 2]
, we cannot write this as 12 + 12.
class Solution {
public:
bool judgePoint24(vector<int>& nums) {
bool result=false;
vector<double> v;
for(int num:nums) v.push_back((double)num);
DFS(v,result);
return result;
}
void DFS(vector<double> nums, bool& result)
{
if(result) return;
if(nums.size()==1)
{
if(abs(nums[0]-24.0)<zero) result=true;
return;
}
for(int i=0;i<nums.size();i++)
{
for(int j=i+1;j<nums.size();j++)
{ // 考虑六种组合情况,除法需要考虑除数不为零
unordered_set<double> s;
s.insert(nums[i]+nums[j]);
s.insert(nums[i]-nums[j]);
s.insert(nums[i]*nums[j]);
if(abs(nums[j])>zero) s.insert(nums[i]/nums[j]);
s.insert(nums[j]-nums[i]);
if(abs(nums[i])>zero) s.insert(nums[j]/nums[i]);
vector<double> tmp=nums;
// 注意一定要先删除tmp[j]再删除tmp[i],先删除小的下标会影响之后的元素下标
tmp.erase(tmp.begin()+j);
tmp.erase(tmp.begin()+i);
for(double num:s)
{
tmp.push_back(num);
DFS(tmp,result);
tmp.pop_back();
}
}
}
}
private:
constexpr static double zero=0.0001; // 用极小值表示零,用于判断double
};