uva 10562

来源:互联网 发布:南京java工资一般多少 编辑:程序博客网 时间:2024/06/05 05:33

题目大意:
利用字母和|和-表示成的树,表示成()形式将树表示出来

#include <iostream>using namespace std;#include <cstring>#include <string>struct Node{    int flag;    Node(int a = 0) :flag(a){}};char a[205][205];int i;bool isNode(char c){    if (c == ' ' || c == '|' || c == '#' || c == '-'|| c=='\n' || c=='\0')        return false;    return true;}void  build(int t,int left,int right){    int j,q=0,l=0,r=0;    Node * root = new Node();    for (j = 0; j <strlen(a[t]); j++)    {        if (j > right) return;        if (isNode(a[t][j]) && (j>=left && j<= right))        {                       root->flag++; //计算有几个字母            printf("%c(", a[t][j]);        }        if (root->flag && a[t + 1][j] == '|')        {            for (q = j; q >= 0; q--)                if (a[t + 2][q] != '-')                {                    l = q + 1;                    break;                }            if (q == -1)                l = 0;            for (q = j; q < strlen(a[t+2]); q++)                if (a[t + 2][q] != '-')                {   r = q-1;                    break;                }            if (q == strlen(a[t + 2]))                r = strlen(a[t + 2]);            build(t + 3, l, r);            root->flag = 0;        }           if (isNode(a[t][j]) && (j >= left && j <= right))            printf(")");//      if (t >= i && j == strlen(a[t]))//          break;    }}int main(){    int T;    Node * root = new Node();    scanf("%d", &T);    getchar();    while (T--)    {        memset(a, '\0', 205*205*sizeof(char));        for (i = 0;gets(a[i]); i++)        {            if (strcmp(a[i],"#") == 0)                break;        }        if (--i == 1)            printf("()\n");        else        {            printf("(");            build(0,0,strlen(a[0])-1);            printf(")\n");        }    }    return 0;}
0 0