又是一道让我心碎的题。UVA上提交了10几次都错了,在北大上又过了。用栈做的,在处理输入和判断括号上感觉还蛮良好的。
#include <stdio.h> #include <string.h> #define MAXN 10000 int stack[MAXN]; int topc, top, t; bool judge() { int sum = 0; for (int i=1; i<=top; i++) sum += stack[i]; if (sum == t) return true; return false; } int main() { //freopen("f:\\out.txt", "w", stdout); while (scanf("%d", &t) != EOF) { int tmp = 0, flag = 0, isNeg = 0; char pre[4]; topc = top = 0; memset(pre, 0, sizeof (pre)); while (1) { // 接收字符的代码,忽略掉空格和换行 char ch = getchar(); while ('\n'==ch || ' '==ch) ch = getchar(); // 记录该字符前三个字符,便于判断是否为叶子 pre[3] = pre[2]; pre[2] = pre[1]; pre[1] = pre[0]; pre[0] = ch; // 如果遇到左括弧就进栈 if ('(' == ch) { topc++; if (tmp) { if (isNeg) { tmp *= -1; isNeg = 0; } stack[++top] = tmp; tmp = 0; } continue; } // 如果遇到右括弧就出栈 if (')' == ch) { // 如果为叶子便计算 if ('('==pre[1] && ')'==pre[2] && '('==pre[3]) { if (!flag) flag = judge(); } else if (pre[1] != '('){ top--; } topc--; // 如果左括弧都被匹配完说明二叉树输入完毕 if (!topc) break; continue; } if ('-' == ch) isNeg = 1; else tmp = tmp*10 + (ch-'0'); } if (flag) printf("yes\n"); else printf("no\n"); } return 0; }
下面是一个牛人的代码,膜拜。忘了在哪找的了。
#include<iostream> using namespace std; bool ok; bool tree_sum(int n,int sum) { int v; char ch; cin>>ch; if(!((cin>>v)==0)) { n+=v; bool t=tree_sum(n,sum)|tree_sum(n,sum); if(!ok&&!t) ok=(n==sum); cin>>ch; return true; } else { cin.clear();//消除错误状态 cin>>ch; return false; } } int main() { // freopen("f:\\out.txt", "w", stdout); int sum; while(cin>>sum) { ok=false; tree_sum(0,sum); cout<<(ok?"yes":"no")<<endl; } return 0; }