现在的位置: 首页 > 综合 > 正文

[UVA 10562] Undraw the Trees (根据图形建立二叉树)

2018年01月12日 ⁄ 综合 ⁄ 共 958字 ⁄ 字号 评论关闭

Undraw the Trees

题目链接:http://acm.bnu.edu.cn/bnuoj/problem_show.php?pid=18980

题目大意:

  有一颗树用如下方式表示:

2

A

|

--------

B C D

|   |

--------- --

E F G

#

e

|

----

f g

#

其中,2表示样例数,每组样例以#结束。所有在屏幕可以显示的字符都可以为树的结点,除了‘ ’, '-', '|'以外,每个字符正下方有 | ,表示有子节点,该字符的所有子节点在‘---------’的范围内。最后用如下的方式输出该树,

(A(B(E()F()G())C(E()F()G())D())

(e(f()g())

解题思路:

显然这道题可以通过递归的思想来建立树。而在第一行的上面加上“----------------”,可以把这道题简化,使得每3行一组,这样就比较容易递归实现了,不需要将第一行单独处理。

代码:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<cstdlib>
using namespace std;
char mp[220][220];
int n;
void dfs(int x, int y)
{
    int i;
    for (i = y; mp[x][i] == '-'; i++)
        if (mp[x + 1][i] != ' ' && mp[x + 1][i] != '\0')
        {
            printf("%c(", mp[x + 1][i]);
            if (mp[x + 2][i] == '|')
            {
                int j = i;
                while(mp[x + 3][j - 1] == '-' && j) j--;
                dfs(x + 3, j);
            }
            printf(")");
        }
}
void solve()
{
    for (int i = 0; mp[1][i]; i++)
        mp[0][i] = '-';
    printf("(");
    dfs(0, 0);
    printf(")\n");
}
int main ()
{
    int t, i;
    cin>>t;
    getchar();
    while(t--)
    {
        n = 1;
        memset(mp, '\0', sizeof(mp));
        while(gets(mp[n]))
        {
            if (mp[n][0] == '#')
            {
                n--;
                break;
            }
            n++;
        }
        if (!n) puts("()");
        else solve();
    }
    return 0;
}

抱歉!评论已关闭.