1、题目
https://leetcode-cn.com/problems/24-game/submissions/
2、题意
题解1:dfs+回溯
除法有可能为小数
每次选两个数nums[i]和nums[j],枚举所有情况(除法的时候 要保证被除数不为0),遍历所有情况(删除nums[i]和nums[j]并加上一个这两个数能构成的一种情况);
当nums.size()=1时判断nums[0]-24的绝对值是否<1e-5 是的话则有解;
class Solution {
public:
bool judgePoint24(vector<int>& nums) {
vector<double> v;
for(auto &x:nums)
v.push_back((double)x);
return dfs(v);
}
bool dfs(vector<double>&nums)
{
if(nums.size()==1)
return abs(nums[0]-24.0)<eps;
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]);
s.insert(nums[j]-nums[i]);
if(nums[j]>eps)
s.insert(nums[i]/nums[j]);
if(nums[i]>eps)
s.insert(nums[j]/nums[i]);
vector<double> tmp = nums;
/*先删除tmp[j]再删tmp[i],若先删tmp[i]会影响数组下标*/
tmp.erase(tmp.begin()+j);
tmp.erase(tmp.begin()+i);
for(auto &x:s)
{
tmp.push_back(x);
if(dfs(tmp))
return true;
tmp.pop_back();
}
}
}
return false;
}
private:
float eps = 1e-5;
};