24点游戏c++

来源:互联网 发布:淘宝网最新版本 编辑:程序博客网 时间:2024/06/08 12:56

题目描述

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)=24NO思路:类似于上一篇表达式数的值,但不同的(也是比较坑的地方)是这里的四个数计算过程中可能是小数,故要用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;      }
原创粉丝点击