24点游戏c++

题目描述

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;


      }
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值