1. 程式人生 > >UVA-699 The Falling Leaves

UVA-699 The Falling Leaves

對於這個題目,要分析學習的還是所應用的遞迴。

在寫遞迴具體步驟的時候,可以把目光集中到遞迴當中的一 項上,比如遞迴剛開始怎麼走,遞迴最後一步要結束了該怎麼走。

想遞迴,要著眼於大局,寫遞迴,要工筆細描,著眼單步;

這道題目是應用於樹的先序方式輸入的遞迴方式,在init()只作為最初的判斷和根節點的左右樹的遞迴入口;build()函式則是整個遞迴函式體,邊讀入邊統計。

#include <bits/stdc++.h>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <algorithm>
#include <iostream>
//#define  LOCAL
using namespace std;
const int maxn=1e5+10;
int sum[maxn];
void build(int p)
{
	int v;cin>>v;
	if(v==-1) return;
	sum[p]+=v;
	build(p-1);
	build(p+1);
}
bool init()
{
	int v;cin>>v;
	if(v==-1) return false;
	memset(sum,0,sizeof sum);
	int pos=maxn/2;
	sum[pos]+=v;
	build(pos-1);
	build(pos+1);
	return true;
}
int main()
{
	#ifdef LOCAL
    	freopen("in.txt","r",stdin);
    	//freopen("out.txt","w",stdout);
	#endif
    int case1=1;
    while(init())
    {
    	int p=0;
    	while(sum[p]==0)p++;
    	cout<<"Case "<<case1++<<":\n"<<sum[p];
    	p++;
    	while(sum[p]!=0) cout<<" "<<sum[p++];
    	cout<<endl<<endl;
    }
   	return 0;
}