这道题的dfs不是那么的明显,但是这道题让我对递归有了新的认识,凡是结构一样的数据, 当我们处理的时候,首先想到的是递归
#include<cstdio>
#include<cctype>
#include<cstring>
using namespace std;
const int maxn = 210;
char buf[maxn][maxn];
int n; //数组的总行数
int main(){
int T;//存储的是测试用例的个数
fgets(buf[0],maxn,stdlin); //首先读入的也就是测试用例的个数,这个函数值的学习
sscanf(buf[0],"%d",&T); //将字符转换成数字,这个函数值的学习
while(T--) //开始对于每个测试用例进行处理
solve();
return 0;
}
void solve(){
n=0; //保存的是每个测试用例的行数,也就是数组的行数
for(;;){
fgets(buf[n],maxn,stdin); //依次的读入每个测试用例的每一行
if (buf[n][0] == '#') //当读到#号的时间就结束
break;
else
n++;
}
printf("(");//输出开始的(
if(n){
for(int i=0; i<strlen(buf[0]);i++)
if(buf[0][i] !=' ' ){ //其实也就是找到根元素,过滤掉前面的空格
dfs(0,i);
break;
}
}
cout <<")" << endl; //打印最后的)
}
//其实树形结构本身就是一种递归结构,下面的处理就是使用了递归结构
void dfs(int r,int c){
printf("%c(",buf[r][c]);
if (r+1<n && buf[r+1][c] == '|'){ //其实也就是判断下一行是否是| ,n是数组的总行数
int i=c; //在不改变c的基础上面,往左或右寻找‘-----’的边界
while (buf[r+2][i]=='-'&&buf[r+3][i] == '-') i--; //查找‘--’的左边界
while (buf[r+2][i]=='-' && buf[r+3][i] != '\0'){ //这个寻找的是右边界
if (!isspace(buf[r+3][i])) //在左右边界划定的范围内向下一行寻找字符
dfs(r+3,i);//到了树的新的一层,这时间呢,就开始使用递归
i++; //对该层的其它兄弟节点同样进行递归
}
}
printf(")");//其实这道题这样想: A()的括号里扩的是其儿子节点,所以开头的时候,打印的是A( 中间使用dfs进行递归
//最后打印的是)
}