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

UVa 699 – The Falling Leaves

2013年01月10日 ⁄ 综合 ⁄ 共 1044字 ⁄ 字号 评论关闭

实质上是一个二叉树的DFS,先左子树,再右子树,因为题目说最大宽度为80,所以开一个80的数组,从中间(40)开始,往里递归。

以第二组数据为例,

8 2 9 -1 -1 6 5 -1 -1 12 -1-1 3 7 -1 -1 -1

开始a[40]=8,其左子树 2 (a[39]=2),右子树 3 (a[41]=3);

2的左子树为 9 (a[38]=9),右子树为6,则其右子树的值应该加到a[40]上,即:a[40]+=6,此时a[40]=14;

而9的左右子树都为-1,不作处理,然后对2的右子树6进行处理,其左子树为 5 (a[39]+=5,则a[39]为7),其右子树为 12 (a[41]+=12则,a[41]为15);

而根的右子树 3 (a[41]=3),其左子树为7(a[40]+=7,此时[40]=21),右子树为-1(舍去)。

所以,其左界为38,右界为41,依次输出 a[38]=9,a[39]=7,a[40]=21,a[41]=15。

代码如下:

#include<iostream>
#include<cstring>
#include<cstdlib>
#include<cstdio>
#include<cmath>
#include<string>
using namespace std;
int a[80+2],Left,Right;
void Tree_DFS(int l,int r)
{
    int ll,rr;
    scanf("%d",&ll);
    if(ll!=-1)
    {
        a[l]+=ll;
        if(l<Left)
            Left=l;   //记录左边界
        Tree_DFS(l-1,l+1);
    }
    scanf("%d",&rr);
    if(rr!=-1)
    {
        a[r]+=rr;
        if(r>Right)
            Right=r;   //记录右边界
        Tree_DFS(r-1,r+1);
    }
    if(ll==-1||rr==-1)
        return ;
}
int main()
{
#ifdef test
    freopen("sample.txt","r",stdin);
#endif
    int num=1;
    while(1)
    {
        memset(a,0,sizeof(a));
        scanf("%d",&a[40]);
        if(a[40]==-1)
            break;
        Left=Right=40;
        Tree_DFS(39,41);
        printf("Case %d:\n",num++);
        printf("%d",a[Left]);
        for(int i=Left+1; i<=Right; i++)
            printf(" %d",a[i]);
        printf("\n\n");
    }
    return 0;
}

抱歉!评论已关闭.