#include <cstdio>
#include <iostream>
#include <cstring>
using namespace std;
const int len = 32;
const int maxn = 1024 + 5;//可能出现的总的涂色方块
char s[maxn] = { 0 };//记录读入的字符串
char color[len][len] = { 0 };//记录涂色,注意整个图形的边长及总的个数
int ans;
void build(const char* s, int& p, int r, int c, int w)//注意引用传参的目的,作为全局变量使用,r表示行,c表示列,w表示边长及宽度
{
char ch = s[p++];//注意参数的值同时进行改变
if (ch == 'p')//作为根节点,依次递归进行划分
{
build(s, p, r, c + w / 2, w / 2);
build(s, p, r, c, w / 2);
build(s, p, r + w / 2, c, w / 2);
build(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 (color[i][j] == 0)
{
color[i][j] = 1; ans++;
}
}
}
}
}
int main()
{
int t;
cin >> t;
while (t--)
{
memset(color, 0, sizeof(color));
ans = 0;
for (int i = 0; i < 2; i++)
{
memset(s, 0, sizeof(s));
scanf("%s", s);
int p = 0;
build(s, p, 0, 0, len);//两次进行涂色,直接进行覆盖即可,最后直接统计黑方块的颜色
}
printf("There are %d black pixels.\n", ans);
}
getchar();
getchar();
return 0;
}
1、首先理解二叉树问题与四分图问题的区别,二叉树若只给出先序遍历无法确定二叉树,因为无法确定左右子树,而四分图中无左右子树的区别,给出先序遍历便可以清晰地确定层次关系
2、此题关键在于如何抽象节点,在此题中便于涂色,将面积及区域作为节点,以及将图中方块坐标化,计算两次的和,直接进行覆盖即可
3、同样注意细节,引用传值的目的,注意控制p的读取
4、同样是递归建立四分图,递归注意节点及边长的控制