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; }