这道题真坑,基本上一点东西都没有学到,完全是考细节处理的题目。
但也总结出一点了,建树,或者用类似树的思想解题的时候,输入是最关键的
其它地方倒是没有什么,还是递归的思想啊!!!
还有就是使用fgets函数的输入问题,要么全用,要么就不用。
下面贴上AC代码
还有一点要注意的是,先判断行不行,然后再去改变。
//这题真的是无语了 #include<cstdio> #include<string> #include<cstring> #include<iostream> using namespace std; const int maxn = 200 + 5; char G[maxn][maxn]; char s[maxn]; void print_tree(int r,int c) { printf("%c(",G[r][c]); if(G[r + 1][c]=='|') { int pos1,pos2; for(pos1=c;;) { if((pos1-1>=0)&&G[r+2][pos1-1]=='-') pos1--; else break; } for(int i=pos1;G[r+2][i]=='-'&&G[r+3][i]!='\n';i++) { if(G[r+3][i]!=' ') print_tree(r+3,i); } } printf(")"); } void print_G() { for(int i=0;;i++) { if(G[i][0]=='#') return; for(int j=0;G[i][j]!='\n';j++) printf("%c",G[i][j]); printf("\n"); } printf("\n\n"); } int main() { #ifdef local freopen("input1.txt","r",stdin); //freopen("output2.txt","w",stdout); #endif char buffer[5]; int kase; fgets(buffer,maxn,stdin); sscanf(buffer,"%d",&kase); //scanf("%d",&kase); for(int i=0;i<kase;i++) { memset(G,0,sizeof(G)); int r=0; while(fgets(G[r],maxn,stdin)) { //printf("%c\n",G[r][0]); if(G[r][0]=='#') { break; } r++; } //print_G(); printf("("); for(int j=0;G[0][j]!='\n';j++) { if(G[0][0]=='#') break; if(G[0][j]!=' ') { print_tree(0,j); break; } } printf(")\n"); } return 0; }