UVA Undraw the Trees

#include <cstdio>
#include <iostream>
#include <cstring>
using namespace std;
const int maxn = 200+ 5;
char map[maxn][maxn];//存储读入的数据
int n;
void dfs(int r,int c)//r表示行,c表示列
{
	printf("%c(", map[r][c]);
	if (r + 1 < n&&map[r + 1][c] == '|')//判断是否存在子树
	{
		int i = c;
		while (i - 1 >= 0 && map[r + 2][i - 1] == '-')i--;//因为相应字符对应输入,注意对齐输入时的特点以及格式,找到分隔行最左边
		while (map[r + 2][i] == '-'&&map[r + 3][i] != '\0')//上下对应的判断,上一行控制读取的结束
		{
			if (!isspace(map[r + 3][i]))//不是空格符,则递归向下输出
			{
				dfs(r + 3, i); 
			}
			i++;
		}
	}
	printf(")");//注意每一层处理完整,返回之前加上括号,理解递归处理的强大作用
}
void solve()
{
	n = 0;
	while (1)
	{
		fgets(map[n], maxn, stdin);//注意按照行读入输入字符
		if (map[n][0] == '#')break;
		else
			n++;
	}
	printf("(");//起始括号
	if (n)
	{
		for (int i = 0; i < strlen(map[0]); i++)//读入根节点,进行递归直接输出
		{
			if (map[0][i] != ' ')
			{
				dfs(0, i); break;
			}
		}
	}
	printf(")\n");
}
int main()
{
	int t;
	fgets(map[0],maxn,stdin);//以字符形式读入case数,注意字符与数字的转换
	sscanf(map[0], "%d", &t);//将转换的数字赋值给t
	while (t--)
	{
		solve();
	}
	getchar();
	getchar();
	return 0;
}

1、又一次体会递归的强大作用,递归返回前注意补全格式,将根节点与其子节点处理完成后再进入下一个节点,理解解决二叉树以及多叉树问题中递归的思想方法
2、学习fgets函数的用法,fgets函数功能为: 从文件流读取一行,送到缓冲区,注意使用fgets函数时,对于读取字符个数的控制,fgets读取时能把空白字符同时读取进去,包括空白字符,fgets函数结尾为null控制,若不读取新的字符串,则下次调用fgets函数时仍然调用之前读取的内容
3、isspace函数的用法,用于判断是否存在空白字符,注意空白字符包括'\n'等字符,是一种判断的快捷处理方式

4、注意此题中输入的对应性,仔细观察题中节点表述的方式

5、sscanf函数的用法,用于格式的转变,此处将case以字符方式读入,注意将其转换为对应数字,同时可用于取出特定长度的字符串,并将其转换为对应的格式,sscanf函数是以相应的字符串作为输入源

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值