这是一个貌似很麻烦的题,题目要求是将一颗用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