题目描述
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;
}