UVA699 - The Falling Leaves

这个题我WA了5遍。知道为什么吗?

第一个空格输出的不符合要求:

如果在b[]中,空格,我确实讨论了。而且确信无的正确、

但是如果这棵树只有右儿子的话,在输出a[] 我却忘了讨论。

早知这样,还不如把左右儿子放到一个数组中呢。

思路:

不用建树,

只需用先序的方法遍历一遍即可。

把所有的叶子堆,放到数组中,仔细观察便可得出所有叶堆间的规律。

发话不多说,代码如下:

#include <iostream>
#include <cstring>
using namespace std;
int a[85], b[85], alen, blen;//定义a ,b两个数组,分别记录标号为正和为负的叶堆;
int move(int x)
{
    int d;
    if(cin>>d&&d!=-1)
    {
        if(x<0){b[-1*x]+=d;blen = blen>(-1*x)?blen:(-1*x);}
        else {a[x] +=d;alen = alen>x?alen:x;}
        move(x-1);
        move(x+1);
    }
    else return -1;
    return 0;
}

int main ()
{
    int num = 0;
    while(++num)
    {
        alen = blen = 0;
        memset(a,0,sizeof(a));
        memset(b,0,sizeof(b));
        if(move(0) == -1)break;
        bool flag = false;
        cout<<"Case "<<num<<":"<<endl;
        for(int i = blen; i >=1; i--)
        {cout<<(i==blen?flag = true,"":" ")<<b[i];}
        for(int i = 0; i <= alen; i++)
        {cout<<(!flag&&!i?"":" ")<<a[i];}
        cout<<endl<<endl;
    }
    return 0;
}


posted on 2012-11-04 18:55  Primo...  阅读(129)  评论(0)    收藏  举报