题意是模拟一颗“落叶树”,母结点和子节点的水平距离是1。求从左到到右每列的落叶总数。
挺水的一道题,当时就直接想到哪写到哪了。
直接建立一颗二叉树,用数组来统一每列的落叶数,根结点对应于数组*。
代码:
#include<iostream> #include<cstdio> #include<cstring> #include<cmath> #include<map> #include<queue> #include<stack> #include<vector> #include<ctype.h> #include<algorithm> #include<string> #define PI acos(-1.0) #define maxn 300 #define INF 1<<25 #define MAX 0x7fffffff typedef long long ll; using namespace std; struct Node { int v; int step; Node *lchild; Node *rchild; }; Node *root; int ans[maxn]; int Min,Max; int Buildtree(Node *&node,int step) { node=(Node*)malloc(sizeof(Node)); int x; scanf("%d",&x); if(x==-1) return 0; node->v=x; ans[step]+=x; if(step<Min) Min=step; if(step>Max) Max=step; Buildtree(node->lchild,step-1); Buildtree(node->rchild,step+1); } int main() { int x; int ii=1; while(scanf("%d",&x)&&x!=-1) { Min=100; Max=100; memset(ans,0,sizeof(ans)); root=(Node*)malloc(sizeof(Node)); root->v=x; root->step=100; ans[root->step]+=root->v; Buildtree(root->lchild,99); Buildtree(root->rchild,101); printf("Case %d:\n",ii++); bool jud=0; for(int i=Min; i<=Max; i++) { if(ans[i]!=0&&jud==0) { jud=1;printf("%d",ans[i]); } else if(ans[i]!=0) printf(" %d",ans[i]); } printf("\n"); printf("\n"); } }