这道题真坑,基本上一点东西都没有学到,完全是考细节处理的题目。
但也总结出一点了,建树,或者用类似树的思想解题的时候,输入是最关键的
其它地方倒是没有什么,还是递归的思想啊!!!
还有就是使用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--;elsebreak;}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 localfreopen("input1.txt","r",stdin);//freopen("output2.txt","w",stdout); #endifchar 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;}