题目大意:给出一个树状图,每个节点可以是任意字符,以'#'结尾,输出其先序遍历。
解题思路:用二维数组将整个树状图存下来,用dfs遍历,判断该字符下有分支‘|’,则去寻找其分支下‘-------’的最左端,右端根据长度以及字符来判断。在分支下的下寻找非空格进入dfs。
ac代码:
#include <iostream>
#include <cstring>
using namespace std;
int n, cnt, len, D;
char a[205][205], c[205];
void dfs(int r, int l)
{
int le, ri;
printf("%c(", a[r][l]);
if (r + 1 < D && a[r+1][l] == '|')
{
for (le=l; a[r+2][le-1] == '-' && le-1 >= 0; le--);
for (int i=le; a[r+2][i] == '-' && i<strlen(a[r+3]); i++)
if (!isspace(a[r+3][i]))
dfs(r+3, i);
}
printf(")");
return ;
}
int main(){
scanf("%d", &n);
getchar();
while (n--){
D = 0;
for (int i=0; ; i++){
gets(c);
if (c[0] == '#')
break;
strcpy(a[i], c);
D = i + 1;
}
cnt = 0;
len = strlen(a[0]);
printf("(");
if (D)
for (int i=0; i<len; i++)
if (a[0][i] != ' '){
dfs(0, i);
break;
}
printf(")\n");
}
return 0;
}