紫书—关于树的递归定义的例题
某些题目输入数据是采用递归(先序)的方式来输入数据,这时只能用递归的方式来建立树。
例如:1.洛谷p uva 839 天平 2.洛谷P uva 699 下落的树叶 3.洛谷p uva 297 四分树。
洛谷P uva 839 天平 AC代码展示:
#include<bits/stdc++.h> using namespace std; int w=2; bool inread(int &w){ int w1,d1,w2,d2; cin>>w1>>d1>>w2>>d2; bool a=true,b=true; if(!w1){ a=inread(w1); } if(!w2){ b=inread(w2); } w=w1+w2; return a&&b&&(w1*d1==w2*d2); } int main(){ int n; scanf("%d",&n); while(n>0){ n--; if(inread(w)){ cout<<"YES"<<endl; }else{ cout<<"NO"<<endl; } if(n){ cout<<endl; } } }
洛谷P uva 699 下落的树叶 AC代码展示:
#include<bits/stdc++.h> using namespace std; const int len=1000; int sum[len]; void inread(int pos){ int k; cin>>k; if(k==-1){ return; } sum[pos]+=k; inread(pos-1),inread(pos+1); } bool read(){ int n; cin>>n; memset(sum,0,sizeof(sum)); if(n==-1){ return false; }else{ sum[len/2]=n; inread(len/2-1),inread(len/2+1); return 1; } } int main(){ int flag=0; while(read()){ int p=0; while(sum[p]==0){ p++; } cout<<"Case "<<++flag<<":"<<endl; while(sum[p]!=0){ cout<<sum[p]; p++; if(sum[p]!=0){ cout<<' '; } } cout<<endl<<endl; } }
洛谷P uva 297 四分树 AC代码展示:
#include<bits/stdc++.h> using namespace std; const int maxn=1024; char al[maxn+30]; int buf[32][32]; const int len=32; int sum=0; void draw(int &p,int x,int y,int w){ char ch=al[p]; p++; if(ch=='p'){ draw(p,x,y+w/2,w/2); draw(p,x,y,w/2); draw(p,x+w/2,y,w/2); draw(p,x+w/2,y+w/2,w/2); }else if(ch=='f'){ for(int i=x;i<x+w;i++){ for(int j=y;j<y+w;j++){ if(buf[i][j]==0){ buf[i][j]=1; sum++; } } } } } int main(){ int t; cin>>t; while(t>0){ t--; sum=0; memset(buf,0,sizeof(buf)); for(int i=1;i<=2;i++){ scanf("%s",&al); int p=0; draw(p,0,0,len); } cout<<"There are "<<sum<<" black pixels."<<endl; } }

浙公网安备 33010602011771号