题目描述
输入格式
输出格式
题意翻译
如图所示,可以用四分图来表示一个黑白图像,方法是用根节点表示整幅图像,然后把行列个分成两等份,按图中的方式编号,从左到右对应4个子节点。如果某子节点对应的区域全黑或全白,则直接用一个黑节点或白节点表示;如既有黑又有白,则用一个灰节点表示,并且为这个区域递归建树。 给出两棵四分树的先序遍历,求二者合并(黑色部分合并)黑像素的个数(每幅图都是32X32的)。p表示灰节点,f表示黑节点,e表示白节点。 具体内容看原文和紫书。
感谢 @happyZYM 提供的翻译。
输入输出样例
输入
3 ppeeefpffeefe pefepeefe peeef peefe peeef peepefefe
输出
There are 640 black pixels. There are 512 black pixels. There are 384 black pixels.
代码
#include<iostream>
#include<cstring>
using namespace std;
const int len = 32;
const int N = 1024 + 10;
char s[N];//字符串
int b[len][len], cnt;//图 黑像素的个数
//把字符串s[p...] 导出到以(r, c)为左上角,边长为w的缓冲区
//2 1
//3 4
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);//1
draw(s, p, r, c, w / 2);//2
draw(s, p, r + w / 2, c, w / 2);//3
draw(s, p, r + w / 2, c + w / 2, w / 2);//4
}
else if(ch == 'f')//画黑色素(白色素不画)
{
for(int i = r; i < r + w; i ++)
for(int j = c; j < c + w; j ++)
if(b[i][j] == 0){b[i][j] = 1;cnt ++;}
}
}
int main()
{
int t;
cin >> t;
while(t --)
{
memset(b, 0, sizeof b);
cnt = 0;
for(int i = 0; i < 2; i ++)
{
scanf("%s", s);
int p = 0;
draw(s, p, 0, 0, len);
}
cout << "There are " << cnt << " black pixels." << endl;
}
return 0;
}