数据结构 递归 uva 10562 - Undraw the Trees

这篇博客主要介绍了如何解决UVA在线判题系统中的10562题——Undraw the Trees。题目要求将特定形式的树转换为另一种形式。博主通过解析题意,提出了使用递归算法来动态构建并输出新的树结构的解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

题目链接:

http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=1503

 

题目大意:

将给定形式的一颗树输出成另外形式的一棵树。

 

解题思路:

用递归模拟建树过程,边建树边输出

 

代码:

#include<iostream>
#include<cmath>
#include<cstdio>
#include<cstdlib>
#include<string>
#include<cstring>
#include<algorithm>
#include<vector>
#include<map>
#include<stack>
#include<queue>
#define eps 1e-6
#define INF (1<<20)
#define PI acos(-1.0)
using namespace std;


int sumrow;
char save[220][220];  //边建树边输出结果

bool notin(char a) //处理字符情况
{
    if(a!='-'&&a!=' '&&a!='#'&&a!='|'&&a)
        return true;
    return false;
}

void dfs(int row,int column)
{
    putchar(save[row][column]); 

    if(save[row+1][column]!='|') //叶子节点
    {
        printf("()");
        return ;
    }

    //非叶子节点
    int left,right;
    
    putchar('(');
    left=right=column;
    while(save[row+2][--left]=='-') //向左扫描'-'覆盖范围
    ;
    left++;

    while(save[row+2][++right]=='-') //向右扫描'-'覆盖范围
    ;
    right--;

    for(int i=left;i<=right&&i<strlen(save[row+3]);i++)
        if(notin(save[row+3][i]))
        {
            dfs(row+3,i);
        }
    putchar(')');
    return ;

}

int main()
{
    int ca;

    scanf("%d",&ca);
    getchar();

    while(ca--)
    {
        sumrow=0;
        memset(save,0,sizeof(save)); 

        while(gets(save[++sumrow])&&save[sumrow][0]!='#')
        ;

        sumrow--;
        if(sumrow==0)  //没有考虑空树的情况,坑啊,wa了好几次
        {
            printf("()\n");
            continue;
        }
        for(int i=0;i<strlen(save[1]);i++) //扫描树根的情况。
            if(notin(save[1][i]))
            {
                putchar('(');
                dfs(1,i);
                putchar(')');
            }

        putchar('\n');
    }

    return 0;
}


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值