题目:https://vjudge.net/problem/UVA-10562
解题思路:
用char buf[][]存储输入,fegts(buf[],maxn,stdin)读取每一行的输入,注意每一行输入的末尾是结束符'\0'
先找到后代的起点下标,再往后依次遍历
注意:
1.cin第一个数字后,要用getchar()吃掉紧跟的换行符,否则会被buf[0]读取出错
2.不用单独建树,边dfs边输出
3.-下面除了有结点字符和空格外,还会有结束符'\0',参见题目的第二个例子!!
ac代码:
#include <iostream>
#include <cmath>
#include <cstring>
#include <cctype>
#include <algorithm>
#include <stdlib.h>
#include <vector>
#include <stack>
#include <queue>
#include <set>
#include <map>
#include <sstream>
#define maxn 210
#define inf 1e+9+10
using namespace std;
typedef long long ll;
int n;
char buf[maxn][maxn];
//递归遍历并输出以字符buf[r][c]为根的树
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);// \n也满足if条件
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()
{
//freopen("/Users/zhangkanqi/Desktop/11.txt","r",stdin);
//ios::sync_with_stdio(false);
int t;
cin>>t;
getchar();
//fgets(buf[0],maxn,stdin);
//sscanf(buf[0],"%d",&t);
while(t--)
solve();
return 0;
}