问题 Q: 24点游戏(Ⅰ)
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
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct BiNode
{
char data[5];
struct BiNode *lchild,*rchild;
}BiNode,*Bitree;
int m = 0 ;
Bitree G;
char b[101][5];
Bitree CreateBItree( Bitree G ) //建立二叉链表
{
if( b[m][0] == '#' ) { G = NULL; m++; }
else
{
G = (Bitree)malloc(sizeof(struct BiNode));
strcpy( G->data , b[m++] );
G->lchild = CreateBItree( G->lchild );
G->rchild = CreateBItree( G->rchild );
}
return G;
}
void INorder( Bitree G )
{
if( G != NULL )
{
if( G->data[0] == '+' || G->data[0] == '-' || G->data[0] == '*' || G->data[0] == '/' )
{
printf("(");
INorder( G->lchild );
printf("%s",G->data);
INorder( G->rchild );
printf(")");
}
else printf("%s",G->data);
}
}
double make_end( Bitree G ) //字符串转化成数值
{
if( G != NULL )
{
if( G->data[0] == '+' || G->data[0] == '-' || G->data[0] == '*' || G->data[0] == '/' )
{
switch ( G->data[0] )
{
case '+':return make_end( G->lchild ) + make_end( G->rchild );break;
case '-':return make_end( G->lchild ) - make_end( G->rchild );break;
case '*':return make_end( G->lchild ) * make_end( G->rchild );break;
case '/':{ if( make_end( G->rchild) != 0 )
return make_end( G->lchild ) / make_end( G->rchild );
else return 0; } break;
}
}
else
{
char f[100]; int x ; double y ;
strcpy( f , G->data );
for( x = 0 , y = 0.0; f[x] != '\0'; x++ )
{
y = y * 10.0 +( f[x] - '0' ) * 1.0;
}
return y;
}
}
}
int main()
{
char a[1000];
while( gets( a ) != NULL )
{
int p = 0 , i, q = 0;
for( i = 0; a[i] != '\0'; i++ )
{
if( a[i] != ' ' )
b[p][q++] = a[i];
else
{
b[p++][q++] = '\0';
q = 0;
}
}
b[p++][q++] = '\0'; //将字符串分离出来
G = CreateBItree( G ); //建树,把数组所得的字符串存入树中;
if( make_end( G ) <= 24.000001 && make_end( G ) >= 23.999999) { INorder( G ); printf("=24\n"); }
else printf("NO\n");
m = 0;
}
return 0;
}
本来是相对于上一个博客中的代码,只需稍稍改变一下输出,结果我提交时运行错误或者答案错误,后来看了下别人的代码,发现需要用double类型,这是一个坑呐!