首页 > 其他 > 详细

[dfs]Undraw the Trees 看图写树

时间:2019-02-27 21:12:16      阅读:388      评论:0      收藏:0      [点我收藏+]


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

 

[dfs]Undraw the Trees 看图写树

原文:https://www.cnblogs.com/Kaike/p/10446794.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!