需要注意的是节点是除了“-”,“|”,和空格的其他字符,节点无子树,要输出()。
书上的代码,主要学习下一些函数的用法:
#include<stdio.h>
#include<algorithm>
#include<cctype>
#include<cstring>
using namespace std;
const int maxn=200+10;
int n;
char buf[maxn][maxn];
void dfs(int r,int c)
{
printf("%c(",buf[r][c]);
if(r+1<n&&buf[r+1][c]=='|')
{
int i=c;
while(i-1>=0&&buf[r+2][i-1]=='-')i--;
while(buf[r+2][i]=='-'&&buf[r+3][i]!='\0')
{
if(!isspace(buf[r+3][i])) dfs(r+3,i);
i++;
}
}
printf(")");
}
void solve()
{
n=0;
for(;;)
{
fgets(buf[n],maxn,stdin);
if(buf[n][0]=='#')break;
else n++;
}
printf("(");
if(n)
{
for(int i=0;i<strlen(buf[0]);i++)
if(buf[0][i]!=' ')
{
dfs(0,i);break;
}
}
printf(")\n");
}
int main()
{
int T;
fgets(buf[0],maxn,stdin);
sscanf(buf[0],"%d",&T);
while(T--)
solve();
return 0;
}
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<math.h>
char a[200+2][200+2];
int cct;
void dfs(int x, int y)
{
int i, j, k;
for(i = y; a[x][i] == '-'; i ++)
if(a[x+1][i] != ' ' && a[x+1][i] != '\0')
{
printf("%c(", a[x+1][i]);
if(x + 1 < cct&& a[x + 2][i] == '|')
{
for(j=i; j && a[x+3][j-1] == '-'; j --);
dfs(x+3, j);
}
printf(")");
}
}
int main()
{
#ifdef state
freopen("sample.txt","r",stdin);
#endif
int num,i;
scanf("%d",&num);
getchar();
while(num--)
{
cct = 1;
memset(a, 0, sizeof(a));
while(1)
{
gets(a[cct++]);//这样输入好
if(!strcmp(a[cct-1], "#"))
break;
}
cct--;
if(cct == 1) // 树为空时,需要特殊处理
puts("()");
else
{
int i,len = strlen(a[1]);
for(i = 0; i < len; i ++)
a[0][i] = '-';
printf("(");
dfs(0, 0);
printf(")\n");
}
}
return 0;
}