UVA 297 - Quadtrees

我自己的神码,祸害了我两天的时间:尴尬

各种逻辑错误,小型代码错误:

思路倒不难,只是这段时间代码敲的少,能力严重下降了!!!

主要是用递归函数来模拟人的比较方法。和二叉树的逻辑差不多的。

代码如下:

#include <iostream>
#include <string>
using namespace std;
string s1, s2;
int black;
int s1n, s2n;
int mypow(int e, int n)//我自己写的pow()函数;
{
    int sum= 1;
    for(int i = 0; i < n; i++)
        sum*=e;
    return sum;
}
int returnblack(int presionnum, int x)//returnblack()函数用来对付【e】【peeepeeef】的情况
{
    for(int i = 1; i <= 4; i++)
    {
        if(x == 1)
        {
            if(s1[s1n] == 'p'){++s1n;returnblack(presionnum+1, 1);}
            else {
                    if(s1[s1n] == 'f')black += (1024/(mypow(4,presionnum)));
                    ++s1n;//cout<<s1n<<endl;
                 }
        }
        else
        {
            if(s2[s2n] == 'p'){++s2n;returnblack(presionnum+1, 2);}
            else {
                    if(s2[s2n] == 'f')black += (1024/(mypow(4,presionnum)));
                    ++s2n;
                }
        }
    }
    return 0;
}
int nextnode(int x)//用来对付【f】【peeepeeef】的情况。
{
    for(int i = 1; i <= 4; i++)
    {
        if(x == 1)
        {
            if(s1[s1n] == 'p'){++s1n;nextnode(1);}
            else ++s1n;
        }
        else
        {
            if(s2[s2n] == 'p'){++s2n;nextnode(2);}
            else ++s2n;
        }
    }
    return 0;
}
int Cacultor(int presionnum)//当p与p相遇时就进行子代的比较。如:【peeef】【pffff】
{

    for(int temp = 1; temp <= 4;temp++)
    {//cout<<"****"<<s1[s1n]<<":"<<s1n<<"  "<<"****"<<s2[s2n]<<":"<<s2n<<endl;
        if(s1[s1n] == 'p' && s2[s2n] == 'p')
            {++s1n; ++s2n;Cacultor(presionnum+1);}
        else if(s1[s1n] == 'f' || s2[s2n] == 'f')
        {
            black += (1024/mypow(4, presionnum));//cout<<"***"<<black<<endl;
            if(s1[s1n] == 'p') {++s2n;++s1n;nextnode(1);}
            else if(s2[s2n] == 'p') {++s1n;++s2n;nextnode(2);}
            else { ++s1n; ++s2n;}
        }
        else if(s1[s1n] == 'e' || s2[s2n] == 'e' )
        {
            if(s1[s1n] == 'p')
                {
                    ++s2n;++s1n;returnblack(presionnum+1,1);
                }
            else if(s2[s2n] == 'p')
                {
                    ++s1n;++s2n;returnblack(presionnum+1,2);
                }
            else {++s1n; ++s2n;}
        }
    }
    return 0;
}

int main ()
{
    int num;
    cin>>num;
    while(num--)
    {
        black = s1n = s2n = 0;//black用来记录黑色像素的个数,s1n和s2n分别用来记录s1和s2的比较节点处的当前位置。
        cin>>s1>>s2;
        if(s1[0] == 'p'&& s2[0] == 'p')
           {++s1n;++s2n; Cacultor(1);}
        else if(s1[0] == 'f' || s2[0] == 'f')
        {
            black += (1024/mypow(4, 0));
            if(s1[0] == 'p') nextnode(1);
            else if(s2[0] == 'p') nextnode(2);
        }
        else if(s1[0] == 'e' || s2[0] == 'e' )
        {
            if(s1[0] == 'p')
                returnblack(0,1);
            else if(s2[0] == 'p')
                returnblack(0,2);
        }
        cout<<"There are "<<black<<" black pixels."<<endl;
    }
    return 0;
}


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值