#include<bits/stdc++.h>
using namespace std;
const int maxn=210;
int n;
char buf[maxn][maxn];
void dfs(int r,int c)
{
cout<<buf[r][c]<<'(';
if(r+1<n&&buf[r+1][c]=='|')
{
int i=c;
while(i-1>=0&&buf[r+2][i-1]=='-') i--;
while(buf[r+2][i]=='-'&&buf[r+3][i]!='\0')
{if(!isspace(buf[r+3][i])) dfs(r+3,i);i++;}
}
cout<<')';
}
void solve()
{
n=0;
for(;;)
{
fgets(buf[n],maxn,stdin);
if(buf[n][0]=='#')
break;
else n++;
}
cout<<'(';
if(n)
{
for(int i=0;i<strlen(buf[0]);i++)
if(buf[0][i]!=' ') {dfs(0,i);break;}
}
cout<<')'<<endl;
}
int main()
{
int T;
fgets(buf[0],maxn,stdin);
sscanf(buf[0],"%d",&T);
while(T--) solve();
return 0;
}
就是刘汝佳树上的代码
他用了比较少见的fgets和sscanf
fgets 多了一个参数,file * ,填上stdin就和gets相仿了
sscanf 从字符串中读取字符,第一个参数填上字符串指针就可以了
这道题的dfs很简单,就是不断地对字符往下搜索,往下时把前括号打上,退回时把后括号打上 ,就可以了