24点游戏 程序(三)

增加了部分去重复的功能,以及后缀转中缀显示。

#include #include #include #include #include #include using namespace std; struct TOperData { int operType; double data; }; //检查计算的参数是否合法,也可以用于过滤一些重复的表达式 bool checkjisuan(double a, double b, int op) { if (op == '/' && b < 1e-6 && b > -1e-6) return false; if (op == '-' && b < 1e-6 && b > -1e-6) return false; if (op == '/' && (fabs(b-1.0f) < 1e-6 || fabs(b+1.0f) < 1e-6)) return false; if (op == '+' || op == '*') return a <= b; return true; } //消除重复 bool checkOp(TOperData computeData[]) { for (int i = 0; i < 6; i++) { int type1 = computeData[i].operType; int type2 = computeData[i+1].operType; if (type1 == '-' && (type2 == '+' || type2 == '-')) { return false; } else if (type1 == '/' && (type2 == '*' || type2 == '/')) { return false; } } return true; } //求值 double jisuan(double a, double b, int op) { switch(op) { case '+': return a + b; case '-': return a - b; case '*': return a * b; case '/': return a / b; default: return -1; } } //计算表达式的值 double process(TOperData data[]) { int len = 7; stack suffix; for (int i = 0; i < len; i++) { if (data[i].operType == 0) { suffix.push(data[i]); } else if (data[i].operType > 0) { if (suffix.empty()) return false; if (suffix.top().operType == 0) { double a = suffix.top().data; suffix.pop(); if (!suffix.empty() && suffix.top().operType == 0) { double b = suffix.top().data; suffix.pop(); if (!checkjisuan(b,a,data[i].operType)) return -1; double c = jisuan(b,a,data[i].operType); TOperData opdata; opdata.operType = 0; opdata.data = c; suffix.push(opdata); } else { return -1; } } else { return -1; } } } if (suffix.empty()) return -1; if (suffix.top().operType == 0) { double r = suffix.top().data; suffix.pop(); if (suffix.empty()) return r; } return -1; } int op(char x) { if (x == '+')return 1; else if (x == '-')return 1; else if (x == '*')return 2; else if (x == '/')return 2; else return 0; } //后缀转中缀 string posttomid(TOperData data[]) { stack a, b; //后缀转回中缀 stack ope; stack opn; string tmp1, tmp2; for (int i = 0; i < 7; i++) { if (data[i].operType == 0) { char buffer [33]; itoa (data[i].data,buffer,10); string tt = ""; tt += buffer; opn.push(tt); ope.push(data[i]); } else { if (op(ope.top().operType) != 0 && (op(data[i].operType) > op(ope.top().operType) || (op(data[i].operType) == op(ope.top().operType) && (data[i].operType == '-' || data[i].operType == '/')))) { tmp2 = "("; tmp2 += opn.top(); tmp2 += ")"; } else { tmp2 = opn.top(); } opn.pop(); ope.pop(); if (op(ope.top().operType) != 0 && op(data[i].operType) > op(ope.top().operType)) { tmp1 = "("; tmp1 += opn.top(); tmp1 += ")"; } else { tmp1 = opn.top(); } ope.pop(); opn.pop(); tmp1 += data[i].operType; tmp1 += tmp2; opn.push(tmp1); ope.push(data[i]); } } string result = opn.top(); cout< -1e-6 && r-24 < 1e-6) { cout<

1 1 1 8,(1+1+1)*8
1 1 1 11,(1+1)*(1+11)
1 1 1 12,1*(1+1)*12
1 1 1 13,(1+1)*(13-1)
1 1 2 6,2*(1+1)*6
1 1 2 7,(1+2)*(1+7)
1 1 2 8,1*(1+2)*8
1 1 2 9,(1+2)*(9-1)
1 1 2 10,2*(1+1+10)

。。。

大概6s取得单一结果,一共1362个解。

取得全部结果需要14s。其实还是有很多重复。离http://www.24theory.com/theory/的结果还有一定距离。需要更细化的过滤。

这部分暂时不做了。有空还是想做一个android的24点小游戏。


转载于:https://www.cnblogs.com/marryZhan/archive/2012/02/26/2497557.html

你可能感兴趣的:(游戏,移动开发)