Undraw the Trees
题目链接:http://acm.bnu.edu.cn/bnuoj/problem_show.php?pid=18980
题目大意:
有一颗树用如下方式表示:
2
A
|
--------
B C D
| |
--------- --
E F G
#
e
|
----
f g
#
(A(B(E()F()G())C(E()F()G())D())
(e(f()g())
解题思路:
显然这道题可以通过递归的思想来建立树。而在第一行的上面加上“----------------”,可以把这道题简化,使得每3行一组,这样就比较容易递归实现了,不需要将第一行单独处理。代码:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<cstdlib>
using namespace std;
char mp[220][220];
int n;
void dfs(int x, int y)
{
int i;
for (i = y; mp[x][i] == '-'; i++)
if (mp[x + 1][i] != ' ' && mp[x + 1][i] != '\0')
{
printf("%c(", mp[x + 1][i]);
if (mp[x + 2][i] == '|')
{
int j = i;
while(mp[x + 3][j - 1] == '-' && j) j--;
dfs(x + 3, j);
}
printf(")");
}
}
void solve()
{
for (int i = 0; mp[1][i]; i++)
mp[0][i] = '-';
printf("(");
dfs(0, 0);
printf(")\n");
}
int main ()
{
int t, i;
cin>>t;
getchar();
while(t--)
{
n = 1;
memset(mp, '\0', sizeof(mp));
while(gets(mp[n]))
{
if (mp[n][0] == '#')
{
n--;
break;
}
n++;
}
if (!n) puts("()");
else solve();
}
return 0;
}