解析
一般感觉和树有关的题目递归较好解决。此题中收获以下几个知识点:
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] == '|') { 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) { 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; }
} cout << ")\n"; } }
int main() { fgets(str[0], maxn, stdin); sscanf(str[0], "%d", &t); while(t--) solve(); return 0; }
|