题目链接:
https://leetcode-cn.com/problems/24-game/
思路:非常经典的暴搜题。虽然没有什么算法,但却是练习dfs的好机会。
本质就是不断从数组中取出两个数,进行加减乘除运算,然后将新值在放入数组中。
剪枝有两个方向,第一当找到能得到24的组合时,结束递归。
第二,加法和乘法有交换性。
class Solution {
public:
double eps = 1e-5;
bool ans=0;
bool judgePoint24(vector<int>& nums) {
vector<double> vec;
for(auto t:nums) vec.push_back(t);
dfs(vec);
//cout<<ans<<endl;
return ans;
}
void dfs(vector<double> vec)
{
//cout<<endl;
int n=vec.size();
if(n==1)
{
if(vec[0]<=(24+eps)&&vec[0]>=(24-eps)) ans=1;
return;
}
for(int i=0;i<n;i++)
{
for(int j=0;j<n;j++)
{
if(i==j) continue;
double a=vec[i],b=vec[j];
for(int k=0;k<4;k++)
{
if((k==0||k==2)&&j>i) continue;
double tmp;
bool flag=0;
if(k==0)
{
tmp = (a+b);
}
else if(k==1)
{
tmp = (a-b);
}
else if(k==2)
{
tmp=a*b;
}
else
{
if(fabs(b)<eps)
{
flag=1;
}
else
{
tmp=(1.0*a)/b;
}
}
vector<double> dl;
for(int t=0;t<n;t++)
{
if(t==i||t==j) continue;
dl.push_back(vec[t]);
}
if(flag==1) continue;
dl.push_back(tmp);
dfs(dl);
}
}
}
}
};