題目:輸入字符串形式的樹,輸出對應的樹的描述,用括號表示一顆子樹。
分析:搜索。在每行利用‘-’查找到每個ASC字符(除去‘ ’,‘#’,‘-’,‘|’),然後遞歸處理即可。
說明:空字符可能會導致錯誤,╮(╯▽╰)╭。
#include <algorithm>
#include <iostream>
#include <cstdlib>
#include <cstring>
#include <cstdio>
using namespace std;
char buf[222][222];
bool isnode(char ch)
{
if (ch == '#' || ch == ' ' || ch == '|' || ch == '-' || !ch)
return false;
return true;
}
void dfs(int x, int y, int deep)
{
if (y >= deep) return;
int l = x, r = x;
while (l > 0 && buf[y][l-1] == '-') l --;
while (buf[y][r+1] && buf[y][r+1] == '-') r ++;
for (int i = l; i <= r; ++ i) {
if (isnode(buf[y+1][i])) {
printf("%c(",buf[y+1][i]);
if (buf[y+2][i] == '|')
dfs(i, y+3, deep);
printf(")");
}
}
}
int main()
{
int t;
while (~scanf("%d%*c",&t)) {
while (t --) {
int count = 1;
memset(buf, 0, sizeof(buf));
while (gets(buf[count])) {
if (buf[count][0] != '#')
count = count+1;
else break;
}
printf("(");
for (int i = 0; buf[1][i]; ++ i) {
if (isnode(buf[1][i])) {
dfs(i, 0, count);
}
}
printf(")\n");
}
}
return 0;
}
測試數據:
6
A
|
--------
B C D
| |
----- -
E F G
#
e
|
----
f g
#
#
ABC
#
A
|
-----
E F G
| | |
- - -
D B C
#
A
|
-----
E F
| |
- ---
D B C
#