uva10562 看图写树

你的任务是将多叉树转化为括号表示法。如下图所示,每个结点除了"-","|",’#‘和空格的其他字符表示,每个非叶结点的正下方总会有一个’|‘字符,然后下方是一排"-"字符,恰好覆盖在所有子节点的上方,单独的一行’#'为数据结束的标记。

输入 
 
2
A | -------- BC D | | ----- - E FG # e | ---- f g #

 输出

(A(B()C(E()F())D(G())))

(e(f()g()))

这个题就只是模拟一下建树的过程。dfs走一遍即可,稍微注意下数据的读取方式

#include <bits/stdc++.h>
using namespace std;
char a[205][205];
void dfs(int i,int u)
{
    int j,front,rear;
    front=i;rear=i;
    printf("%c(",a[u][i]);
     if(a[u+1][i]!='|')  { cout<<")";return ;}// 此时为空树 
    for(;;)
    {
        if(a[u+2][front-1]=='-')
        front--;
        else break; 
    }
     for(;;)
      {
        if(a[u+2][rear+1]=='-')
            rear++;
        else break;
     }
    for(int j=front;j<=rear;j++)
    
        if(a[u+3][j]!=' '&&a[u+3][j]!='\0')
        dfs(j,u+3);
         cout<<")";
    
} 
int main()
{
    int t;
    cin>>t;
    getchar();
    while(t--)
    {
        int i=0;
        memset(a,' ',sizeof(a));
        while(gets(a[i])&&'#'-a[i][0])//仍有输入并且不是结束符,循环读入。 
            i++;
          cout<<"(";
        if(i)
        { for(i=0;i<strlen(a[0]);i++)//在第一行找到树的起始位置。 
            if(a[0][i]!=' ')
                dfs(i,0);
        cout<<")"<<endl;
        }
    }
        return 0;    
    }

 

posted @ 2020-09-26 15:24  徒手拆机甲  阅读(104)  评论(0)    收藏  举报