題目
就是給你一個所謂的二叉樹的S-expression 讓你判斷是否存在指定的 根到葉子的路徑和。
我在這裡用到cin.putback() (C裡有 int ungetcA(int ch, FILE *stream) 在cstdio中),方便把下一個字元拿出來判斷後再塞回緩衝區,最後用格式化讀。
特別注意的是,題目所說的葉子,必須具有(integer()()) 這樣的形式才是一個葉子,也就是不是算到() 這裡的。開始我一直拿()當路徑的結尾,結果就wa了。也是,怎麼能拿空節點當葉子呢....好像有點sb...
另外,ac後又測試了下,輸入資料中 數字間都沒有空格,不是在這裡wa的。
代碼:
//二叉樹,遞迴。C裡有沒有類似 cin.putback(char) ??#include<cstdio>#include<cstring>#include<iostream>using namespace std;#define MAXN 1000002//沒說多少?int n;char Rchar(){char t;while(scanf("%c", &t) && (t==' ' || t=='\n')){}return t;}int solve(int root, int sum)//(3(...)(...)){Rchar();//'('char t = Rchar();if(t==')'){if(sum+root == n) { char buf[3];buf[0] = Rchar();buf[1] = Rchar();cin.putback(buf[1]);cin.putback(buf[0]);if(buf[0] == '(' && buf[1] == ')') return 1;//證明是子葉else return 0;}else return 0;}cin.putback(t);//!!!!!!c 裡有沒有相應函數?int r;scanf("%d", &r);int ret1 = solve(r, sum+root);int ret2 = solve(r, sum+root);Rchar();//')'return ret1 || ret2;}int main(){while(scanf("%d", &n)!=EOF){printf(solve(0, 0)? "yes": "no");putchar('\n');}}