看图写树(6-17)读后实现

这道题的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进行递归
	//最后打印的是) 
} 
 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值