這是一個貌似很麻煩的題,題目要求是將一顆用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