UVA - 10562 Undraw the Trees
/* 直接在二维字符数组中递归,无须建树 注意对空树的处理,以及,结点标号可以是任意可打印字符 其他链接: 1. http://www.cnblogs.com/Bob-tong/p/6610647.html isspace()函数的功能为:判断输入字符是否为空格/回车/制表符等 (而不仅仅只是判断空格) 2. http://blog.csdn.net/daiyutage/article/details/8540932 fgets()函数的有关介绍,一般 fgets()会比用 gets()安全,所以很有必要仔细研究下 fgets()的用法 3. http://www.cnblogs.com/kex1n/archive/2011/06/09/2076501.html sscanf()函数,利用它可以从字符串中取出整数、浮点数和字符串等等 */
#include <cstdio> #include <cctype> #include <cstring> using namespace std; const int N = 200 + 10; int n; char buf[N][N]; // 递归遍历并且输出以字符 buf[r][c] 为根的树 void dfs(int r, int c) { printf("%c(", buf[r][c]); if ( r + 1 < n && buf[r + 1][c] == '|' ) //有子树 { int i = c; while ( i - 1 >= 0 && buf[r + 2][i - 1] == '-' ) i--; //找“----”的左边界 while ( buf[r + 2][i] == '-' && buf[r + 3][i] != '\0' ) { if ( !isspace (buf[r + 3][i]) ) dfs(r + 3, i); // fgets 读入的 '\n' 也满足 isspace() i++; } } printf(")"); } void solve() { n = 0; while (true) { fgets(buf[n], N, stdin); if (buf[n][0] == '#') break; else n++; } printf("("); if (n) { for (int i = 0; i < strlen(buf[0]); i++) if (buf[0][i] != ' ') { dfs(0, i); break; } } printf(")\n"); } int main() { int t; // fgets(buf[0], N, stdin); // sscanf(buf[0], "%d", &t); scanf("%d", &t); getchar(); while (t--) solve(); return 0; }