UVA

来源:互联网 发布:手机万网域名如何解析 编辑:程序博客网 时间:2024/06/06 03:01
/*  直接在二维字符数组中递归,无须建树  注意对空树的处理,以及,结点标号可以是任意可打印字符    其他链接:  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;}


原创粉丝点击