【DFS】UVa10562 - Undraw the Trees

题意

将多叉树转化成括号表示法,每个非叶结点的正下方有一个“|”,再下方是一排“-”,恰好覆盖所有子节点的上方

思路

一行行读入,从根节点开始找起,dfs遍历

总结

以下代码WA=。= 改成书上那种写法才AC。但是仍不明白为什么

while(cin.getline(s[n],maxn))

    if(s[n++][0] == '#') break; 

...

...

void dfs(...)

{

  ...

  if(s[r+1][0] != '#' && s[r+1][c] == '|')   

  ...

}

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <cstring>
 4 #include <algorithm>
 5 using namespace std;
 6 const int maxn = 205;
 7 char s[maxn][maxn];
 8 int T, n;
 9 void dfs(int r, int c)
10 {
11     cout << s[r][c] << "(";
12     if(r+1 < n && s[r+1][c] == '|' ){
13         int i = c;
14         for(i = c; i-1 >= 0; i--)
15             if(s[r+2][i-1] != '-') break;
16         for(;s[r+2][i] == '-' && s[r+3][i] != '\0';i++)
17             if(!isspace(s[r+3][i])) dfs(r+3, i);
18 
19     }
20     cout << ")";
21 }
22 int main()
23 {
24  //   freopen("in.txt","r",stdin);
25     cin >> T;
26     getchar();
27     while(T--){
28         n = 0;
29         memset(s, 0, sizeof s);
30         while(cin.getline(s[n],maxn))
31             if(s[n][0] == '#') break;
32             else n++;
33         cout << "(";
34         if(n){
35             int len = strlen(s[0]);
36             for(int i = 0; i < len; i++)
37                 if(s[0][i] != ' ')
38                     dfs(0, i);
39         cout << ")" << endl;
40     }
41     return 0;
42 }

 

posted @ 2016-10-18 13:16  kikii233  阅读(83)  评论(0)    收藏  举报