紫书题目-黑色像素

给你一个正方型的格子,这个样的一个方格可以被分成不多的小的格子,同时这样的格子会被填充颜色,四个格子为一个节点,如果这样的四个格子里面不只含有一种颜色,那么这样的一个节点在一颗四分树就会用一个灰色的节点进行表达,现在给你两个字符串,问你这两个字符串中一共含有多少的黑色像素。题中给出了一个例子,从这个例子中的话能够得出的是什么呢。大概就是,当这样的格子被分成16分的时候。每一个黑色的格子代表的是64,也就是说要是你能够统计出这棵树中含有多少个黑色像素就可以得出最终的数字,也就是要求的答案。

 
书中直接介绍的方法就是,将给出的字符串的画到每一个小的格子中,每画出一个黑色的格子的话就直接记下来,然后再进行写一个的计算。
这一段代码的话,我感觉我在这里分析一下
void draw(const char*s,int &p,int r,int c,int w)
{
    char ch=s[p++];
    if(ch=='p')
    {
        draw(s,p,r,c+w/2,w/2);
        draw(s,p,r,c,w/2);
        draw(s,p,r+w/2,c,w/2);
        draw(s,p,r+w/2,c+w/2,w/2);
    }
    else if(ch=='f')
    {
        for(int i=r;i<r+w;i++)
            for(int j=c;j<c+w;j++)
            if(buf[i][j]==0)
        {
            buf[i][j]=1;
            cnt++;
        }
    }
}
 
看到上面的源代码,先将存储的数组传递过来,然后判断这个字符串中的第一个元素是什么,如果是p,那么就将以这个节点为根节点的子树填充到方格中去,因为给定的顺序是先2后1,再是3然后是4.于是这里填充的时候就要按照这个顺序进行下去。如果数组中的元素不是P的话,那么直接进行填充。然后计数。
 
源代码
#include<cstdio>
#include<cstring>
#include<iostream>
 
using namespace std;
 
const int maxn=1024+10;
const int len=32;
char s[maxn];
int buf[len][len],cnt;
 
void draw(const char*s,int &p,int r,int c,int w)
{
    char ch=s[p++];
    if(ch=='p')
    {
        draw(s,p,r,c+w/2,w/2);
        draw(s,p,r,c,w/2);
        draw(s,p,r+w/2,c,w/2);
        draw(s,p,r+w/2,c+w/2,w/2);
    }
    else if(ch=='f')
    {
        for(int i=r;i<r+w;i++)
            for(int j=c;j<c+w;j++)
            if(buf[i][j]==0)
        {
            buf[i][j]=1;
            cnt++;
        }
    }
}
 
int main()
{
    int T;
    scanf("%d",&T);
    while(T--)
    {
        memset(buf,0,sizeof(buf));
        cnt=0;
        for(int i=0;i<2;i++)
        {
            scanf("%s",s);
            int p=0;
            draw(s,p,0,0,len);
        }
        printf("There are %d black pixels. ",cnt);
    }
    return 0;
}
原文地址:https://www.cnblogs.com/yewa/p/7243562.html