写个24点不难,把括号括的没问题(没有多余的括号)还是要花点心思。
这个动态规划的实现,免去了递归求解的很多重复计算。
#include <iostream>
#include <stdlib.h>
#include <string>
#include <vector>
#include <stdio.h>
#include <sstream>
#include <cmath>
#include <algorithm>
using namespace std;
#define N 4
#define NUM 16
struct Node{
double val;
int count;
char op;
string exp;
};
vector<double> ops(N);
bool cmp(const Node &n1, const Node &n2){
return n1.exp<n2.exp;
}
bool cmp2(const Node &n1, const Node &n2){
return n1.exp==n2.exp;
}
void put(vector<Node> &v, Node &node1, Node &node2, double result,char op){
stringstream ss;
Node node3;
node3.val = result;
node3.count = node1.count + node2.count;
node3.op = op;
if(node1.count == 1 || node1.op == '*' || node1.op == '/'
|| op == '+' || op == '-')
ss<<node1.exp;
else
ss<<"("<<node1.exp<<")";
ss<<op;
if(node2.count == 1 || (( node2.op == '*' || node2.op == '/') && (op == '+' || op=='-')) )
ss<<node2.exp;
else
ss<<"("<<node2.exp<<")";
ss>>node3.exp;
v.push_back(node3);
}
void game24(){
vector<vector<Node> >res(NUM,vector<Node>());
for(int i=0;i<N;++i){
Node node;
node.val = ops[i];
node.count = 1;
stringstream ss;
ss<<ops[i];
ss>>node.exp;
int idx = pow(2,i);
res[idx].push_back(node);
}
for(int i=1;i<NUM;++i){
if(!res[i].empty())
continue;
for(int x = 1; x<i; ++x){
if((x&i) == x){
int y = i-x;
for(int p = 0;p<res[x].size();++p){
for(int q = 0;q<res[y].size();++q){
Node node1 = res[x][p];
Node node2 = res[y][q];
put(res[i],node1,node2,node1.val+node2.val,'+');
put(res[i],node1,node2,node1.val-node2.val,'-');
put(res[i],node1,node2,node1.val*node2.val,'*');
if(node2.val!=0)
put(res[i],node1,node2,node1.val/node2.val,'/');
}
}
}
}
sort(res[i].begin(),res[i].end(),cmp);
res[i].erase(unique(res[i].begin(),res[i].end(),cmp2),res[i].end());
}
for(int j=0;j<res[NUM-1].size();++j){
if(fabs(res[NUM-1][j].val-24)<1e-6)
cout<<res[NUM-1][j].exp<<endl;
}
}
int main(){
while(cin>>ops[0]>>ops[1]>>ops[2]>>ops[3]){
game24();
}
system("pause");
return 0;
}