我的24点算法

来源:互联网 发布:曼谷酒店知乎 编辑:程序博客网 时间:2024/05/01 05:08

  

Code:
  1. #include <stdlib.h>   
  2. #include<iostream>   
  3. #include<vector>   
  4. #include<string>   
  5. #include<math.h>   
  6. /*这里一定要加math头文件,否则stdlib里面的abs函数返回的是int型,会造成错误滴*/  
  7. using namespace std;   
  8. enum operators{add, minus, multiply, divide};   
  9. vector<string> vec_answer;   
  10.   
  11.   
  12.   
  13. class Answer   
  14. {//答案系统   
  15.     vector<string> answers;   
  16. public:   
  17.     void addAnswer(const string an)   
  18.     {   
  19.         for(int i=0; i<answers.size(); i++)   
  20.         {   
  21.             if(an==answers[i])   
  22.                 return;   
  23.         }   
  24.         answers.push_back(an);   
  25.   
  26.     }   
  27.     void showAnswer()   
  28.     {   
  29.         for(int i=0; i<answers.size(); i++)   
  30.             cout<<answers[i]<<endl;   
  31.         if(0==answers.size())   
  32.             cout<<"没有答案"<<endl;   
  33.     }   
  34. };   
  35.   
  36. Answer myanswer;   
  37. struct Number   
  38. {   
  39.   
  40. public:   
  41.     float value;   
  42.     operators lastoper;   
  43.     string caculatStruct;   
  44.     char IntegerToChar[4];   
  45.     Number(const float value)   
  46.     {   
  47.         this->value=value;   
  48.         lastoper=multiply;   
  49.         caculatStruct=string(itoa(int(value), IntegerToChar,  10)  );   
  50.   
  51.     }   
  52.     void changeValue( const Number& j,  const operators oper)//通过j和运算符改变值   
  53.     {   
  54.            
  55.   
  56.         this->lastoper = oper;   
  57.         if(j.value==4)   
  58.             value=value;   
  59.         switch (oper)   
  60.         {   
  61.         case add:   
  62.             value+=j.value;   
  63.             caculatStruct+="+" + j.caculatStruct;   
  64.             break;   
  65.         case minus:   
  66.             value-=j.value;   
  67.             caculatStruct+="-" + j.caculatStruct;   
  68.             break;   
  69.         case multiply:   
  70.             value*=j.value;   
  71.             caculatStruct+="*" + j.caculatStruct;   
  72.             break;   
  73.         case divide:   
  74.             value/=j.value;   
  75.             caculatStruct+="/" + j.caculatStruct;   
  76.             break;   
  77.   
  78.         }   
  79.     }   
  80.   
  81.     void addBrackets()//加括号   
  82.     {   
  83.         caculatStruct="(" + caculatStruct+")";   
  84.     }   
  85. };   
  86.   
  87.   
  88.   
  89. void caculate(Number& i_num, Number& j_num, operators oper)   
  90. {   
  91.     if(multiply==oper || divide==oper)   
  92.     {   
  93.         if(add==i_num.lastoper || minus==i_num.lastoper)   
  94.             i_num.addBrackets();//加括号   
  95.         if(add==j_num.lastoper || minus==j_num.lastoper)   
  96.             j_num.addBrackets();//加括号   
  97.            
  98.     }   
  99.     if(minus == oper)   
  100.     {   
  101.         if(add==j_num.lastoper || minus==j_num.lastoper)   
  102.             j_num.addBrackets();//加括号   
  103.     }   
  104.     i_num.changeValue(j_num, oper);   
  105.        
  106.            
  107.   
  108.   
  109. }   
  110. template<typename T>   
  111. bool vec_erase(vector<T>&  numbers, int idx)//idx指示要删除的位置   
  112. {   
  113.     if(idx >= numbers.size())   
  114.         return false;   
  115.     vector<T>::iterator Iterator=numbers.begin();   
  116.   
  117.     for(int i=0; i<idx; i++)   
  118.         Iterator++;   
  119.   
  120.     numbers.erase(Iterator);   
  121.   
  122. }   
  123. bool construct24(vector<Number>& num)   
  124. {   
  125.   
  126.     bool flag=false;   
  127.     int size=num.size();   
  128.     if(1 == size)   
  129.     {   
  130.         if(abs(num[0].value-float(24)) <0.00001)   
  131.         {   
  132.             float a=abs(num[0].value-float(24));   
  133.             myanswer.addAnswer(num[0].caculatStruct);   
  134.             return true;   
  135.         }   
  136.         return false;   
  137.     }   
  138.        
  139.   
  140.     forint i=0; i<num.size(); i++)   
  141.     {   
  142.            
  143.         forint j=0; j<num.size(); j++)   
  144.         {   
  145.             if(j==i )   
  146.                 continue;//或者重复数字了,继续循环   
  147.             for(int oper=0; oper<4; oper++)   
  148.             {   
  149.                 if(3 == oper && 0 == num[j].value)   
  150.                     continue;   
  151.                 vector<Number> newNum=num;   
  152.                 caculate(newNum[i], newNum[j], operators(oper));   
  153.                 vec_erase<Number>(newNum, j);//删除第j个Number   
  154.                 construct24(newNum);   
  155.             }   
  156.                    
  157.   
  158.         }   
  159.     }   
  160.   
  161.   
  162. }   
  163.   
  164. int main()   
  165. {       
  166.     vector<Number> numbers;   
  167.     numbers.push_back(Number(1));   
  168.     numbers.push_back(Number(5));   
  169.     numbers.push_back(Number(5));   
  170.     numbers.push_back(Number(5));   
  171.   
  172.     construct24(numbers);   
  173.     myanswer.showAnswer();   
  174.        
  175.   
  176. }  

 

原创粉丝点击