数据结构,树。
求每列各结点的合,左子树往左边多一列,右子树往右边。看题目中的图很容易理解。。注意,有可能亮点会重合。还有输入有换行。一开始没看懂样例
可以建树做,不过我觉得太麻烦了
直接将开个大点的数组,中间那个数字存根结点的,然后若往左,则坐标减减,往右则加。
#include<cstdio>
#include<cstring>
#include<stdlib.h>
const int MAXN=2000;
int v[MAXN],middle;
int a[MAXN],i,ln,rn;
void creetree(int value){
if(middle<ln) ln=middle;
if(middle>rn) rn=middle;
v[middle]+=value;
i++;scanf("%d",&a[i]);
if(a[i]!=-1) {middle--;creetree(a[i]);middle++;}
i++;scanf("%d",&a[i]);
if(a[i]!=-1) {middle++;creetree(a[i]);middle--;}
}
int main(){
//freopen("in.txt","r",stdin);
//freopen("out.txt","w",stdout);
int counter=0;
while(1){
ln=2000;rn=0;middle=1000;
i=0;counter++;
memset(v,0,sizeof(v));
scanf("%d",&a[i]);
if(a[i]==-1) return 0;
else creetree(a[i]);
printf("Case %d:\n%d",counter,v[ln]);
for(int i=ln+1;i<=rn;i++) printf(" %d",v[i]);
printf("\n");
printf("\n");
}
return 0;
}