uva 10562 Undraw the Trees

将一棵多叉树转换为括号表示。直接在一个二维数组里递归。一道比较水的题,但被数据给恶心到了,‘#’不可以表示结点,注意空树的处理,(第一行为空,别的能构成一棵树,这也为空树,例如{
              (此行为空)      
     a
     |
   -----
  b   c 
}

代码:

#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;

char a[25][205];
int n;
void dfs(int r, int c)
{
    if(a[r][c] == ' ' || a[r][c] == '#') return;
    printf("%c(", a[r][c]);
    if(r+1 < n && a[r+1][c] == '|')//有子树
    {
        int i = c;
        while(i-1 >= 0 && a[r+2][i-1] == '-')//找---左界
            i--;
        while(a[r+2][i] == '-' && a[r+3][i] != '\0')
        {
            if(!isspace(a[r+3][i]))
                dfs(r+3, i);
            i++;
        }
    }
    printf(")");

}
int main()
{
    int t; cin >> t;
    getchar();
    while(t--)
    {
        char s[205];
        memset(a, 0, sizeof(a));
        int j = 0;
        while(1)
        {
            gets(s);
            int len = strlen(s);
            for(int i = 0; i < len; i++)
                a[j][i] = s[i];
            if(a[j][0] == '#') break;
            j++;
        }
        n = j;
        printf("(");
        for(int i = 0; i < 205; i++)
        {
            if(a[0][i] != '\0')
            {

                dfs(0, i);
            }
        }
        printf(")\n");

    }
    return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值