紫薯6.3 基本数据结构----树part2 (eg题部分)

UVA839

在这里插入图片描述
在这里插入图片描述

题意:

给你一个树状天平。判断是否平衡。(w1 x d1=w2 x d2)

思路(二叉树结构):

递归的遍历树即可。

#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
struct node{
    node *left, *right;
    node():left(NULL),right(NULL){}
};
node* root;
node* newnode(){return new node();}
int flag;
int build(node*&u){
    int w1,d1,w2,d2;
    scanf("%d%d%d%d",&w1,&d1,&w2,&d2);
   // cout<<"------";
   // cout<<w1<<d1<<w2<<d2<<endl;
    if(w1==0){
        u->left=newnode();
        w1=build(u->left);
    }
    if(w2==0){
        u->right=newnode();
        w2=build(u->right);
    }
    if(w1*d1!=w2*d2)flag=0;
    return w1+w2;
}
int main()
{
    int t;cin>>t;
    int blank=0;
    while(t--){
        if(blank)puts("");
        else blank=1;
        flag=1;
        root=newnode();
        build(root);
        if(flag)puts("YES");
        else puts("NO");
    }
    return 0;
}
/*
1
0 2 0 4
0 3 0 1
1 1 1 1
2 4 4 2
1 6 3 2
*/

UVA699

在这里插入图片描述

题意:

给你一颗二叉树,并且每个节点都有值。
左子节点,在它的左边一个单位。
右子节点,在它的右边一个单位。

所有x坐标上的点权和。

思路:

先序输入时,顺便存值,可以用map去存。

反思

UVA的一贯风格,严格的格式输出。要行末空格。
行尾不能有多余的空格。

AC

#include <iostream>
#include <map>
#include <cstdio>
#include <cstring>
#include <vector>
#define sz(a) a.size()
using namespace std;
struct node{
    node* left, *right;
    node():left(NULL),right(NULL){}
};
map<int,int>ma;
node* root;
node* newnode(){return new node();}
bool build(node* &u, int x){
    int val;
    scanf("%d", &val);
    if(val==-1)return false;
    ma[x]+=val;
    u->left=newnode();
    u->right=newnode();
    build(u->left,x-1);
    build(u->right,x+1);
    return true;
}
int main()
{
    int kase=0;
    root=newnode();
    while(build(root,1)){
        printf("Case %d:\n",++kase);
        vector<int>ans;
        for(auto x:ma)ans.push_back(x.second);//printf("%d ",x.second);//cout<<x.second<<' ';
        printf("%d",ans[0]);
        for(int i=1; i<sz(ans); i++)printf(" %d",ans[i]);
        puts("");
        root=newnode();
        ma.clear();
        puts("");
    }
    return 0;
}
/*
5 7 -1 6 -1 -1 3 -1 -1
8 2 9 -1 -1 6 5 -1 -1 12 -1 -1 3 7 -1 -1 -1
-1
*/

UVA297

在这里插入图片描述
在这里插入图片描述

题意:

给你一个四分树。其实是一个矩阵,每次四分。(32 x 32)
之后染色。现在有两个矩阵,现在要合并。求合并后的黑色格子数。

思路:

就是二分树,的升级版,多加两个指针而已。

  1. 写一个建树函数。
  2. 之后写一个染色函数。
  3. 最后写一个求答案的dfs即可。

AC

#include <iostream>
#include <cstdio>
#include <string>
#include <cmath>
using namespace std;
string s;
int d[10];
void init(){
    int ret=1;
    for(int i=1; i<=6; i++,ret*=4)d[6-i+1]=ret;
}/// 1 4 16 16*4 16*16 32*32
struct node{
    int col;
    node *c1,*c2,*c3,*c4;
    node():c1(NULL),c2(NULL),c3(NULL),c4(NULL){}
};
node* root;
node* newnode(){return new node();}
void build(node* &u, int lev){
    if(lev==6){
        u->col=0;
        return ;
    }
    u->col=0;
    u->c1=newnode();u->c3=newnode();
    u->c2=newnode();u->c4=newnode();
    build(u->c1,lev+1);
    build(u->c2,lev+1);
    build(u->c3,lev+1);
    build(u->c4,lev+1);
}
void dfs1(node* &u, int &now){//draw
   // cout<<"now----"<<now<<endl;
    now++;
    if(s[now-1]=='p'){
        if(u->col!=1)u->col=2;
        dfs1(u->c1,now);
        dfs1(u->c2,now);
        dfs1(u->c3,now);
        dfs1(u->c4,now);
    }else if(s[now-1]=='f')u->col=1;
}
int dfs2(node* &u, int lev){
    int ret=0;
    if(u->col==2){
        ret+=dfs2(u->c1,lev+1);
        ret+=dfs2(u->c2,lev+1);
        ret+=dfs2(u->c3,lev+1);
        ret+=dfs2(u->c4,lev+1);
    }else if(u->col==1)ret+=d[lev];
    return ret;
}
int main()
{
    init();
    int t;cin>>t;
    while(t--){
        root=newnode();
        build(root,1);
        cin>>s;
        int now=0;
        dfs1(root,now);
        cin>>s;
        now=0;
        dfs1(root,now);
        cout<<"There are "<<dfs2(root,1)<<" black pixels."<<endl;
    }
    return 0;
}
/*
3
ppeeefpffeefe
pefepeefe
peeef
peefe
peeef
peepefefe
*/
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值