您的位置:首页 > 编程语言 > C语言/C++

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语言