你有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;
}
-----------------------------------------------
代码:
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;
}
相关文章推荐
- 从扑克牌种任取4张,通过加减乘除四则运算得到数字24
- 4个10以内的数字,通过四则运算得到24
- Demo24 :提高线程优先级(通过修改线程的优先级使线程获得优先处理)
- 4个10以内的数字,通过四则运算得到24
- 通过调用系统API获得网卡真实MAC地址
- 如何通过地址栏传递参数及获得参数
- python怎样获得字符串中所有的数字
- 获得训练集和XML通过opencv自带程序opencv_createsamples.exe&opencv_traincascade.exe的问题
- 通过DatabaseMetaData对象获得数据库元数据信息
- 通过 CCMutableTexture2D 获得具体点的像素值.
- python通过自定义isnumber函数判断字符串是否为数字的方法
- 震惊!黑客竟可通过数字录像机等联网设备开采比特币
- 黑马程序员_建立一个文本框 一个文本区域 一个按钮 文本框只能输入数字 并通过按钮 转换到文本区域
- 通过javascript获得url参数
- 随机 随机获得100个50-100的数字字符串,存到数组并输出
- C#通过反射获得类的实例简单实现
- 通过交换获得两个数组的最小差(转)
- 通过CreateToolhelp32Snapshot函数获得系统中当前运行的进程信息
- 页面通过key获得后台传的Map
- 通过系统广播,获得apk的packageName以后,如何仅通过packageName获取其他信息