这题思路上解决不难,关键是输入上,直接用cin 是不可以的,因为cin遇到空格就停止。用cin.getline()就可以解决了。
#include<cstdio>
#include<cstring>
#include<iostream>
using namespace std;
const int maxn=500;
int T,cur,row;
char g[maxn][maxn];
bool judge_char(char c){
if(c!='|'&&c!=' '&&c!='-') return true;
return false;
}
void dfs(int cur,int row){
putchar(g[cur][row]),putchar('(');
if(g[cur+1][row]=='|'){///有子树
int left_row;
for(left_row=row;g[cur+2][left_row-1]=='-';left_row--);///确定左边界
for(;g[cur+2][left_row]=='-';left_row++)
if(judge_char(g[cur+3][left_row])&&g[cur+3][left_row]!='\0') dfs(cur+3,left_row);
}
putchar(')');
}
int main(){
while(cin>>T){
cin.get();///吸收掉缓冲区中的回车
for(int cas=1;cas<=T;cas++){
memset(g,0,sizeof(g));
cur=0;
for(;;){
cin.getline(g[cur]+1,maxn);
if(g[cur][1]=='#') break;
cur++;
}
g[cur][1]='\0';
putchar('(');
for(row=1;row<=strlen(g[0]+1);row++)
if(judge_char(g[0][row])){
dfs(0,row);break;
}
printf(")\n");
}
}
return 0;
}