uva 10562 - Undraw the Trees

uva 10562 - Undraw the Trees

   这是一个貌似很麻烦的题,题目要求是将一颗用ascii码绘画出来的树,转换为其一种字符串表示,这种字符串表示好像是叫做什么广义表
什么的。
   比如,
       A

    |

--------

B  C   D

   |   |

 ----- -

 E   F G 对应的字符串表示 (A(B()C(E()F())D(G())))

   
   比较纠结的是如何读取数据,如何递归,如果建立树的话,也麻烦,因为还是颗不定叉的树。最主要的是如何方便地递归。最后知道了一个
比较巧妙的方法,先一次性把一组数据读入字符串数组里面,再在这个字符串数组上进行递归处理。这样的话,就能很方便的找到树里面节点
的关系了。
   而一次读一个字符就想进行递归是没办法确定节点的关系的,不递归估计更很难写,完全没头绪。。。

代码如下:
 1 #include <stdio.h>
 2 #include < string.h>
 3 
 4  char szLines[210][210];
 5  int nNumOfLine;
 6 
 7  void GetAns( int i,  int j)
 8 {
 9      // printf("i:%d, j:%d, %c\n", i, j, szLines[i][j]);
10      
11      if (szLines[i][j] != '\0')
12     {
13         putchar(szLines[i][j]);
14          // printf("%c", szLines[i + 1][j]);
15           if (szLines[i + 1][j] == '|')
16         {
17              int nBeg, nEnd;
18             nBeg = nEnd = j;
19              while (nBeg >= 0 && szLines[i + 2][nBeg] == '-')
20             {
21                 --nBeg;
22             }
23              while (szLines[i + 2][nEnd] == '-')
24             {
25                 ++nEnd;
26             }
27              // printf("nBeg:%d, nEnd:%d\n", nBeg, nEnd);
28              putchar('(');
29              for ( int k = nBeg; k <= nEnd; ++k)
30             {
31                  if (szLines[i + 3][k] != ' ' && szLines[i + 3][k] != '\0')
32                 {
33                     GetAns(i + 3, k);
34                 }
35             }
36             putchar(')');
37         }
38          else
39         {
40             printf("()");
41         }
42     }
43     
44 }
45 
46  int main()
47 {
48      int nN;
49      char ch;
50 
51     scanf("%d", &nN);
52     getchar();
53      while (nN--)
54     {
55         nNumOfLine = 0;
56         memset(szLines, 0,  sizeof(szLines));
57          while (gets(szLines[nNumOfLine]), szLines[nNumOfLine][0] != '#')
58         {
59              // printf("%s\n", szLines[nNumOfLine]);
60              nNumOfLine++;
61         }
62          if (nNumOfLine == 0)
63         {
64             printf("()\n");
65              continue;
66         }
67          int i, j;
68         i = 0;
69          for (j = 0; szLines[0][j] == ' '; ++j);
70          // printf("i:%d, j:%d\n", i, j);
71          putchar('(');
72         GetAns(i, j);
73         putchar(')');
74         putchar('\n');
75     }
76     
77      return 0;
78 }
79 

你可能感兴趣的:(uva 10562 - Undraw the Trees)