紫书—关于树的递归定义的例题

  某些题目输入数据是采用递归(先序)的方式来输入数据,这时只能用递归的方式来建立树。

  例如: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;
    }
}

 

posted @ 2021-05-17 14:53  江间暮云  阅读(97)  评论(0)    收藏  举报