您的位置:首页 > 其它

你有4张卡片,每张卡片从1到9的数字,通过*,/,+, - ,(,)来获得24的值。

2017-11-24 12:25 253 查看
本题源自leetcodehttps://leetcode.com/problems/24-game/description/

-----------------------------------------------

 

代码:

bool judgePoint24(vector<int>& nums) {
sort(nums.begin(),nums.end());
do{
if(isValid(nums)){
return true;
}
}while(next_permutation(nums.begin(),nums.end()));
return false;
}
bool isValid(vector<int> &nums){
double a=nums[0];
double b=nums[1];
double c=nums[2];
double d=nums[3];

if(isValid(a+b,c,d)||isValid(a-b,c,d)||isValid(a*b,c,d)|| b&&isValid(a/b,c,d))
return true;
if(isValid(a,b+c,d)||isValid(a,b-c,d)||isValid(a,b*c,d)|| c&&isValid(a,b/c,d))
return true;
if(isValid(a,b,c+d)||isValid(a,b,c-d)||isValid(a,b,c*d)|| d&&isValid(a,b,c/d))
return true;
return false;
}
bool isValid(double a,double b,double c){
if(isValid(a+b,c)||isValid(a-b,c)||isValid(a*b,c)|| b&&isValid(a/b,c))
return true;
if(isValid(a,b+c)||isValid(a,b-c)||isValid(a,b*c)|| c&&isValid(a,b/c))
return true;
return false;
}
bool isValid(double a,double b){
if(abs(a+b-24.0)<0.0001 || abs(a-b-24.0)<0.0001 || abs(a*b-24.0)<0.0001 |
4000
| b&&abs(a/b-24.0)<0.0001)
return true;
return false;
}

代码2:
public:
double elipson = pow(10.0, -5);
vector<char> operations = {'+','-','*','/'};
bool judgePoint24(vector<int>& nums) {
vector<double> vec;
for(auto n : nums){
vec.push_back(n*1.0);
}
return find24(vec);
}

bool find24(vector<double> vec){
if(vec.size() == 1){
return abs(vec[0] - 24.0) <= elipson;
}
for(int i = 0; i < vec.size(); ++i){//each time we pick up two number for computation
for(int j = 0; j < vec.size(); ++j){
if(i == j) continue;
vector<double> res;
for(int k = 0; k < vec.size(); ++k){
if(k != i && k != j) res.push_back(vec[k]);
}
for(auto op : operations){
if((op == '+' || op == '*') && i > j) continue;//no need to re-calculate
if(op =='/' && vec[j] == 0.0) continue;
switch(op){
case '+': res.push_back(vec[i] + vec[j]); break;
case '-': res.push_back(vec[i] - vec[j]); break;
case '*': res.push_back(vec[i] * vec[j]); break;
case '/': res.push_back(vec[i] / vec[j]); break;
}
if(find24(res)) return true;
res.pop_back();//!!!important
}
}
}
return false;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: