[dfs]Undraw the Trees 看图写树


Undraw the Trees

Description

将多叉树转化为括号表示法。每个结点用除了‘-’, ‘|’, ‘ ’(空格), ‘#’ 的其他字符表示,每个非叶结点的正下方会有一个 ‘|’ 字符,然后下面是一排 ‘-’ 字符,恰好覆盖所有子节点的上方。单独的一行 ‘#’ 为数据结束。

Examples

Input

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

Output

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

正确解法:

dfs吧

求出有几行,然后找到第一个字母,输出 ”(字母 ” 往下递推 最后输出 “ )”

递推:字母下一行一定是 | 再往下是 ----  再下面是字母 ,找到字母 然后依次递推。

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<string>
 4 #include<cstring>
 5 #include<map>
 6 #include<set>
 7 #include<vector>
 8 #include<queue>
 9 #include<algorithm>
10 #include<cmath>
11 using namespace std;
12 typedef long long ll;
13 const int N = 300;
14 int T,n;
15 char tree[N][N];
16 void dfs(int r,int c)
17 {
18     printf("%c(",tree[r][c]);
19     int aa=c,bb=c;
20     if(r+1<n&&tree[r+1][c]=='|')
21     {
22         while(r+2<n&&aa-1>=0&&tree[r+2][aa-1]=='-') aa--;
23         while(r+2<n&&tree[r+2][bb+1]=='-') bb++;
24         for(int i=aa;i<=bb;i++)
25             if(tree[r+3][i]!=' '&&tree[r+3][i]!='\0')
26                 dfs(r+3,i);
27     }
28     printf(")");
29 }
30 int main()
31 {
32     scanf("%d",&T);
33     getchar();
34     while(T--)
35     {
36         n=0;
37         while(true)
38         {
39         gets(tree[n]);
40         if(tree[n][0]=='#') break;
41         n++;
42         }
43         printf("(");
44         if(n)
45         {
46             for(int i=0;i<strlen(tree[0]);i++)
47                 if(tree[0][i]!=' ')
48                 {
49                 //printf("%c\n",tree[0][i]);
50                 dfs(0,i);
51                 break;
52                 }
53         }
54         printf(")\n");
55     }
56     return 0;
57 }
View Code

 

posted @ 2019-02-27 20:48  kaike  阅读(226)  评论(0编辑  收藏  举报