看图写树

解析

一般感觉和树有关的题目递归较好解决。此题中收获以下几个知识点:
1.fgets这类函数会把\n读到字符串里面,而scanf,cin这类的输入不会将\n读入;
2.处理的输入多的时候没必要一次性将所有的数据读入,读入一组处理一组即可。

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
#include <iostream>
#include <string.h>
using namespace std;
/**
*
题目:
看图写树

输入:
2
A
|
--------
B C D
| |
----- -
E F G
#
e
|
----
f g
#

输出:
(A(B()C(E()F())D(G())))
(e(f()g()))

*
* 、
*/


const int maxn = 201;
int t;
int n;

char str[maxn][maxn];

void dfs(int r, int c)
{

cout << str[r][c] << "(";
if(r+1 < n && str[r+1][c] == '|') //此处r+1 < n 防止数组越界
{
int i = c;
while(str[r+2][i-1] != ' ' && i - 1 >= 0)
--i;
while(str[r+2][i] == '-')
{
if(str[r+3][i] != '\0' && !isspace(str[r+3][i]))
dfs(r+3, i);
++i;
}
}
cout << ")";
}

void solve()
{

n = 0;
while(1)
{
//cin >> str[n];
fgets(str[n], maxn, stdin);

if(str[n][0] == '#')
break;
++n;
}
if(n > 0) //处理空树的情况
{
cout << "(";
for (int i = 0; i < strlen(str[0]); ++i)
{
if(str[0][i] != ' ')
{
dfs(0, i);
break; //此处break掉,因为仅仅有一个根节点,这个步骤就是找出树的根节点
}

}
cout << ")\n";
}
}

int main()
{

fgets(str[0], maxn, stdin);
sscanf(str[0], "%d", &t);
while(t--)
solve();
return 0;
}