24点游戏c++
2017-07-04 20:13
369 查看
题目描述
24点游戏的玩法是这样的:任取一幅牌中的 4张牌(不含大小王),每张牌上有数字(其中A 代表1,J 代表11,Q 代表 12,K代表13),你可以利用数学中的加、减、乘、除以及括号想办法得到24,每张牌只能用一次。例如有四张6,那么6+6+6+6=24,也可以6*6-6-6=24。但是有些牌是无法得到24的,比如两张 A 和两张2。读入表达式树的先序遍历字符串, 这里的表达式树是来自24点游戏的真实场景,也就是对应四个数字(值在1到13之间)组成的表达式,问该表达式树能不能得到24?
输入
输入由多组测试数据组成。每组数据包含一行字符串,即24点游戏的表达式树的先序遍历序列。
输出
对于每组数据,输出一行。如果不能得到24,输出“NO”。如果能得到24,按样例输出。样例输入
+ + + 6 # # 6 # # 6 # # 6 # # - - * 6 # # 6 # # 6 # # 6 # # * * 1 # # 2 # # * 1 # # 2 # #
样例输出
(((6+6)+6)+6)=24 (((6*6)-6)-6)=24 NO 思路:类似于上一篇表达式数的值,但不同的(也是比较坑的地方)是这里的四个数计算过程中可能是小数,故要用double或float,选好精度,近似计算
#include<iostream> #include<string> #include<stdlib.h> #include<cstdio> #include<cmath> using namespace std; typedef struct Node { Node *lch,*rch; string data; } Node; string str( "" ); Node *CreateTree() ///建立二叉树 { string s; cin>>s; if (s[0]== '#' ) return NULL; Node *root1= new Node; root1->data.assign(s); root1->lch = CreateTree(); root1->rch = CreateTree(); return root1; } double oper(string &op, double a, double b) { if (op== "+" ) return a+b; if (op== "-" ) return a-b; if (op== "/" ) return double (a*1.0/b); if (op== "*" ) return double (1.0*a*b); } int ssttoi(string &s) { int re=0; for ( int i=0;i!=s.size();++i) { char c=s[i]; re=re*10+c- '0' ; } return re; } double cacul(Node *root2) ///遍历计算 { double lval=0,rval=0; if (root2->lch==NULL&&root2->rch==NULL) return double (ssttoi(root2->data)); else { lval=cacul(root2->lch); rval=cacul(root2->rch); return oper(root2->data,lval,rval); } } void Traversal(Node *root3) ///中序遍历 { if (root3==NULL) return ; if (root3->lch) str+= '(' ; Traversal(root3->lch); str+=root3->data; Traversal(root3->rch); if (root3->rch) str+= ')' ; } void Clea(Node *root4) ///清空树 { if (root4==NULL) return ; Clea(root4->lch); Clea(root4->rch); if (root4->lch!=NULL) delete root4->lch; if (root4->rch!=NULL) delete root4->rch; } int main() { string s; while (cin>>s) { str= "" ; Node *root1= new Node; root1->data.assign(s); root1->lch = CreateTree(); root1->rch = CreateTree(); Traversal(root1); double ans=cacul(root1); if ( fabs (ans-24.0)<1e-8) cout<<str<< "=24" ; else cout<< "NO" ; cout<<endl; Clea(root1); delete root1; } return 0; }
相关文章推荐
- C++ 英雄联盟挑战赛 24点游戏
- [华为OJ--C++]097-24点游戏算法
- 相当棒的24点游戏算法,Javascript写的,不懂,谁能翻译成C/C++?
- 24点游戏C++
- C++实现24点游戏算法
- 24点游戏 C++
- C++实现24点游戏
- 24点游戏的c++代码,能够输出所有可能的解
- c++简单24点游戏
- 用php计算24点游戏
- 用C++实现跨平台游戏开发之Irrlicht引擎
- 游戏状态管理之C++实现
- 转让几本C++、VC、游戏编程精典书
- 24点游戏
- 24点游戏探秘系列6:用概率统计的眼光看24点游戏
- 24点游戏代码
- 用C++实现跨平台游戏引擎开发
- 用C++实现跨平台游戏开发之Allegro引擎
- c/c++程序之_猜数游戏
- 24点游戏探秘系列2:唯一解的情况