说说:
这道题略坑,好久没做过这么坑的题目了QAQ。这题初看挺复杂的,其实就是个树的遍历问题而已。首先题目给你类似如下的一个结构:
A
|
--------
B C D
| |
----- -
E F G
这其实是一棵树。‘|’,‘-’可以看成是树干。然后节点字符是除‘|’,‘-’,‘#’,‘ ’以外的其他可显示的字符。若一个节点有子节点,则其正下方的字符为‘|’,且接下去一行‘-’覆盖的范围是它的孩子节点所在的范围。最后整棵树的输出形式是:(A(B()C(E()F())D(G())))。解法其实很简单,把整棵树读入,然后遍历,判断一个节点有无子节点,有则找出范围,然后找到相应节点,再递归,这样就OK了。这次在这道题上花了这么多时间真的是想当然了。因为题目中在子节点所在的行是没有非法字符的,所以我在搜索子节点时只要判断不是空格符,那就是子节点的字符。结果测试一点问题没有,但是就是AC不了。以后真的要注意这样的问题了!
源代码:
#include <stdio.h>
#include <string.h>
#define MAXN 200+5
#define illegal(s) (s!='-'&&s!='|'&&s!=' '&&s!='#')//判断是否为合法节点
char tree[MAXN][MAXN];
int n;
void search(int,int);
int main(){
int T,i;
char c;
// freopen("data","r",stdin);
scanf("%d",&T);
getchar();
while(T--){
n=0;
while(gets(tree[n]))
if(tree[n][0]=='#')
break;
else
n++;
putchar('(');
for(i=0;i<strlen(tree[0]);i++)
if(illegal(tree[0][i])){
search(i,0);
break;
}
printf(")\n");
}
return 0;
}
void search(int pos,int deepth){
int i,leftmost,rightmost;
putchar(tree[deepth][pos]);
if(deepth==n-1||tree[deepth+1][pos]!='|'){//判断有无子树
printf("()");
return;
}
leftmost=pos;//子树的左边界
while(tree[deepth+2][leftmost]=='-')
leftmost--;
leftmost++;
rightmost=pos;//子树的右边界
while(tree[deepth+2][rightmost]=='-')
rightmost++;
rightmost--;
putchar('(');
for(i=leftmost;i<=rightmost&&i<strlen(tree[deepth+3]);i++)
if(illegal(tree[deepth+3][i]))//合法字符即为子节点
search(i,deepth+3);
putchar(')');
return;
}原文地址:http://blog.csdn.net/u011915301/article/details/39184643