题目大意:
利用字母和|和-表示成的树,表示成()形式将树表示出来
#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;
}