题目描述
![](https://i-blog.csdnimg.cn/blog_migrate/46994aa2cd4afc382881df63d78736a1.png)
输入格式
![](https://i-blog.csdnimg.cn/blog_migrate/628651e608740fd90d44c7565ea60e24.png)
输出格式
![](https://i-blog.csdnimg.cn/blog_migrate/ca8bf4580ada002e66aa12d2d40795c1.png)
【输入样例】
2
A
|
--------
BC D
| |
----- -
E FG
#
e
|
----
f g
#
【输出样例】
(A(B()C(E()F())D(G())))
(e(f()g()))
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cctype>
using namespace std;
const int maxn = 200 + 10;
int n;
char buf[maxn][maxn];
//递归遍历并且输出以字符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])) //fgets读入的“\n”也满足isspace();
dfs(r + 3, i);
i++;
}
}
printf(")");
}
void solve()
{
n = 0;
for (;;)
{
fgets(buf[n], maxn, 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], maxn, stdin);
sscanf(buf[0], "%d", &T);
while (T--)
solve();
return 0;
}