Uva 297 - Quadtrees

抱着打死也不用链表的精神,我把这个题给写出来了(其实也蛮后悔的,感觉不用链表也不是很简洁)。

我的思路基本分两步,第一步先将两个字符串合成一个,这一步我的处理是非常麻烦的(本来预计没有这么麻烦的),分九种小的情况,其中有两种还需要进行特殊的递归处理;第二步相对比较简单,将合成的字符串用个递归函数模拟四叉树便可搞定 ~

#include<iostream>
#include<cstring>
#include<cstdlib>
#include<cstdio>
#include<cmath>
#include<string>
using namespace std;
char c[10000];
int count,k1,k2,f,k;
void Quadtrees(char *cc,int dep)  //第二步处理,将合成的字符串模拟四叉树 ~
{
    dep++;
    for(int i=0; i<4; i++)
    {
        k++;
        if(cc[k]=='f')
            count+=1024/pow(4,dep);
        else if(cc[k]=='p')
            Quadtrees(c,dep);
    }
    return ;
}
int rec(char *t)   // 对 'p' 与 'f' 相遇时,'p'的后续子树进行删除
{
    for(int i=0; i<4; i++)
    {
        f++;
        if(t[f]=='e'||t[f]=='f')
            continue;
        else if(t[f]=='p')
            f=rec(t);
    }
    return f;
}
int deal_p(char *t,int kk)   //  'p' 与 'e' 相遇时,'p'的后续子树的添加处理
{
    for(int i=0; i<4; i++)
    {
        c[k++]=t[kk];
        if(t[kk]=='f'||t[kk]=='e')
        {
            kk++;
        }
        else if(t[kk]=='p')
            kk=deal_p(t,++kk);
    }
    return kk;
}
int conbination(char *a,char *b)   // 将两个字符串合成一个,每个元素相合时,有9种情况
{
    k1=0,k2=0,k=0;
    memset(c,0,sizeof(c));
    while(1)
    {
        if(a[k1]=='\0'&&b[k2]=='\0')
            break;
        if(a[k1]=='f'&&b[k2]=='p')
        {
            c[k]='f';
            k1++;
            f=k2;
            k2=rec(b)+1;
            k++;
        }
        else if(a[k1]=='p'&&b[k2]=='f')
        {
            c[k]='f';
            k2++;
            f=k1;
            k1=rec(a)+1;
            k++;
        }
        else if(a[k1]=='f'&&b[k2]=='f')
        {
            c[k++]='f';
            k1++;
            k2++;
        }
        else if(a[k1]=='f'&&b[k2]=='e')
        {
            c[k++]='f';
            k1++;
            k2++;
        }
        else if(a[k1]=='e'&&b[k2]=='f')
        {
            c[k++]='f';
            k1++;
            k2++;
        }
        else if(a[k1]=='e'&&b[k2]=='p')
        {
            c[k++]='p';
            k2=deal_p(b,++k2);
            k1++;
        }
        else if(a[k1]=='p'&&b[k2]=='e')
        {
            c[k++]='p';
            k1=deal_p(a,++k1);
            k2++;
        }
        else if(a[k1]=='p'&&b[k2]=='p')
        {
            c[k++]='p';
            k1++;
            k2++;
        }
        else if(a[k1]=='e'&&b[k2]=='e')
        {
            c[k++]='e';
            k1++;
            k2++;
        }
        else if(a[k1]=='\0')  // 满足条件,将后续字符串拷入 c,然后结束
        {
            while(b[k2]!='\0')
            {
                c[k++]=b[k2++];
            }
        }
        else if(b[k2]=='\0')
        {
            while(a[k1]!='\0')
            {
                c[k++]=a[k1++];
            }
        }
/        cout<<c<<" "<<k1<<" "<<k2<<" "<<k<<endl;
    }
    return 0;
}
int main()
{
#ifdef test
    freopen("sample.txt","r",stdin);
#endif
    int num;
    char a[10000],b[10000];
    scanf("%d",&num);
    getchar();
    while(num--)
    {
        k1=k2=count=0;
        memset(a,0,sizeof(a));
        memset(b,0,sizeof(b));
        scanf("%s%s",a,b);
        if(a[0]=='f'||b[0]=='f')  // 若是全黑,直接处理
            count=1024;
        else
        {
            conbination(a,b);
            k=0;
            Quadtrees(c,0);
        }
        printf("There are %d black pixels.\n",count);
    }
    return 0;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值