我的24点算法
来源:互联网 发布:曼谷酒店知乎 编辑:程序博客网 时间:2024/05/01 05:08
- #include <stdlib.h>
- #include<iostream>
- #include<vector>
- #include<string>
- #include<math.h>
- /*这里一定要加math头文件,否则stdlib里面的abs函数返回的是int型,会造成错误滴*/
- using namespace std;
- enum operators{add, minus, multiply, divide};
- vector<string> vec_answer;
- class Answer
- {//答案系统
- vector<string> answers;
- public:
- void addAnswer(const string an)
- {
- for(int i=0; i<answers.size(); i++)
- {
- if(an==answers[i])
- return;
- }
- answers.push_back(an);
- }
- void showAnswer()
- {
- for(int i=0; i<answers.size(); i++)
- cout<<answers[i]<<endl;
- if(0==answers.size())
- cout<<"没有答案"<<endl;
- }
- };
- Answer myanswer;
- struct Number
- {
- public:
- float value;
- operators lastoper;
- string caculatStruct;
- char IntegerToChar[4];
- Number(const float value)
- {
- this->value=value;
- lastoper=multiply;
- caculatStruct=string(itoa(int(value), IntegerToChar, 10) );
- }
- void changeValue( const Number& j, const operators oper)//通过j和运算符改变值
- {
- this->lastoper = oper;
- if(j.value==4)
- value=value;
- switch (oper)
- {
- case add:
- value+=j.value;
- caculatStruct+="+" + j.caculatStruct;
- break;
- case minus:
- value-=j.value;
- caculatStruct+="-" + j.caculatStruct;
- break;
- case multiply:
- value*=j.value;
- caculatStruct+="*" + j.caculatStruct;
- break;
- case divide:
- value/=j.value;
- caculatStruct+="/" + j.caculatStruct;
- break;
- }
- }
- void addBrackets()//加括号
- {
- caculatStruct="(" + caculatStruct+")";
- }
- };
- void caculate(Number& i_num, Number& j_num, operators oper)
- {
- if(multiply==oper || divide==oper)
- {
- if(add==i_num.lastoper || minus==i_num.lastoper)
- i_num.addBrackets();//加括号
- if(add==j_num.lastoper || minus==j_num.lastoper)
- j_num.addBrackets();//加括号
- }
- if(minus == oper)
- {
- if(add==j_num.lastoper || minus==j_num.lastoper)
- j_num.addBrackets();//加括号
- }
- i_num.changeValue(j_num, oper);
- }
- template<typename T>
- bool vec_erase(vector<T>& numbers, int idx)//idx指示要删除的位置
- {
- if(idx >= numbers.size())
- return false;
- vector<T>::iterator Iterator=numbers.begin();
- for(int i=0; i<idx; i++)
- Iterator++;
- numbers.erase(Iterator);
- }
- bool construct24(vector<Number>& num)
- {
- bool flag=false;
- int size=num.size();
- if(1 == size)
- {
- if(abs(num[0].value-float(24)) <0.00001)
- {
- float a=abs(num[0].value-float(24));
- myanswer.addAnswer(num[0].caculatStruct);
- return true;
- }
- return false;
- }
- for( int i=0; i<num.size(); i++)
- {
- for( int j=0; j<num.size(); j++)
- {
- if(j==i )
- continue;//或者重复数字了,继续循环
- for(int oper=0; oper<4; oper++)
- {
- if(3 == oper && 0 == num[j].value)
- continue;
- vector<Number> newNum=num;
- caculate(newNum[i], newNum[j], operators(oper));
- vec_erase<Number>(newNum, j);//删除第j个Number
- construct24(newNum);
- }
- }
- }
- }
- int main()
- {
- vector<Number> numbers;
- numbers.push_back(Number(1));
- numbers.push_back(Number(5));
- numbers.push_back(Number(5));
- numbers.push_back(Number(5));
- construct24(numbers);
- myanswer.showAnswer();
- }
- 我的24点算法
- 我的24点算法思路
- “24点”的算法分析
- 24点游戏的算法
- 解24点的算法
- 一个24点的算法
- 24点算法的java代码
- 关于24点问题的算法
- 24 点游戏的初步算法
- python版本的24点游戏算法
- 一个朴素的24点算法
- 24点游戏的算法实现
- 点的旋转算法
- 谈点我的感受
- 捡点我的职业生涯
- 我的2014点点滴
- [修改]24点算法
- 24点算法
- 随笔
- 相约23号
- 第二十三天
- 四色原理
- 面向对象程序设计中类之间的关系
- 我的24点算法
- cygwin下不能退出Emacs的解决办法
- NIO学习笔记
- Java连连看代码---学java时练手的,凑合看吧。
- 哪位老师或同学给解答下,谢谢
- 一个草根关于OO的一点理解
- 自信——随感
- 创建Table
- QQ群78928780记录整理:90521-精华