[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 }
No matter how you feel, get up , dress up , show up ,and never give up.