您的位置:首页 > 其它

uva 112 Tree Summing

2013-05-19 19:50 267 查看
题意:给定一个值 ,一棵树,让你算出 这棵树从上到下的和能不能 为n

解题思路: 先对字符串进行处理 然后再用二维栈模拟树,如果这个节点有父亲节点,这个更新到这个节点的和 如果为叶子节点,则判断它的值!

解题代码:

// File Name: uva112.c
// Author: darkdream
// Created Time: 2013年05月16日 星期四 22时26分01秒

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<time.h>
#include<math.h>
struct node
{
char c;
int num ;
};
void get(char *s)
{ char c;
int j = -1 ;
int k = -1 ;
char temp[5000] = {0};
while(c=getchar())
{
if(c != ' ' && c!= '\n')
{
j++;
s[j] = c;
}
if(c == ')')
{
if(s[j-1] == '(')
{
s[j] = '\0';
s[j-1] = '\0';
j = j-2;
}
if(k == 0 )
break;
else
{  temp[k] = '\0';
k--;

}

}
else if(c == '(')
{
k++;
temp[k] = c;

}
}
}
int main(){

//freopen("/home/plac/problem/input.txt","r",stdin);
//freopen("/home/plac/problem/output.txt","w",stdout);
int n;
while(scanf("%d",&n) != EOF)
{

int ok = 0 ;
char str[5000] ={0};
struct node nodes[5000] = {0};
struct node ans[5000] = {0};
get(str);
//puts(str);

int j = -1;
for(int i = 0 ;i < strlen(str); i ++)
{
if(str[i] == '('  || str[i] == ')')
{
j++;
nodes[j].c = str[i];

}
if(str[i] == '('&& str[i+1] != ')')
{
int k = -1 , num  = 1,temp = 0 ;
if(str[i+1] == '-')
{
num = -1;
i = i+1;
}
for(int t = i+1; ; t++)
{
if(str[t] == '(' || str[t] == ')')
{
i = t-1;
break;
}
else
{
temp = temp *10 + str[t] -'0';
}
}
j++;
nodes[j].c = 'x';
nodes[j].num = num*temp;

}

}
int k = -1;
for(int i = 0 ;i <= j; i ++)
{
if(nodes[i].c == '(')
{
k++;
ans[k].c = '(';
}
else if(nodes[i].c == ')')
{

k = k -2;
}
else
{
k++;
ans[k].c = 'x';
if(k == 1)
{
ans[k].num = nodes[i].num;
}
else
{
ans[k].num = nodes[i].num + ans[k-2].num;
//printf("%d ",ans[k].num);
}

if(nodes[i+1].c == ')')
{
if(ans[k].num == n)
ok = 1;
}

}

}
/*for(int i = 0 ; i<= j;  i ++)
printf("%c",nodes[i].c);
printf("\n");
for(int i= 0 ; i <= j;i ++)
printf("%d ",nodes[i].num);*/
if(ok == 1)
printf("yes\n");
else
printf("no\n");

}
return 0 ;
}


View Code
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: