uva10562看图写树

递归处理即可,

链接:https://www.luogu.com.cn/problem/UVA10562

注意fgets和sscanf的用法,(fgets从指定的流中读取数据,每次读一行)

#include <iostream>
#include <cstdio>
#include <cstring>
#include <string>
#include <algorithm>
#include <queue>

using namespace std;
const int maxn=210;
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--;
        //cout<<i<<endl;
        while(buf[r+2][i]=='-'&&buf[r+3][i]!='\0')//判断是否为'\0' ,不断递归即可 
        {
            if(!isspace(buf[r+3][i]))
             dfs(r+3,i);
            i++;
        }
        //cout<<r<<" "<<i<<endl;
    }
    printf(")");
}
void solve()
{
    n=0;
    for(;;)
    {
        fgets(buf[n],maxn,stdin);
        if(buf[n][0]=='#') break;
        else n++;
    }
    cout<<n<<endl;
    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;
}
/*
2
    A
    |
--------
B  C   D
   |   |
 ----- -
 E   F G
#
*/

 

posted on 2020-03-25 17:41  mmn  阅读(264)  评论(0编辑  收藏  举报