题意:如图6-8所示,可以用四分树来表示一个黑白图像,方法是用根结点表示整幅图像,然后把行列个分城两等分,按照图中的方式编号,从左到右对应4个子结点。如果某子结点对应的取余全白或全黑,则直接用一个黑结点或者白结点表示:如果即有黑又有白,则用一个灰结点表示,并且为这个区域递归建树。
给出两棵四分树的先序遍历,求二者合并之后(黑色部分合并)黑色像素的个数。p表示中间结点,f表示黑色(full),e表示白色(empty)。
每个图的大小都为32*32,输出黑色块的个数。
思路:图非常小,把黑色的都置为1,并统计个数即可。根据先序遍历,把这个图画出来即可。遍历传四个值,当前到的字符串位置p,当前子树左上角坐标(x,y),当前子树边长w。
#include<bits/stdc++.h> using namespace std; const int MAXN = 1200;// 2^10 ↑ char s[MAXN]; int MAP[35][35], p, cnt;// 2^5 ↑ void draw(int &p, int x, int y, int w) { char ch = s[p++]; if (ch == 'p') { draw(p, x, y+w/2, w/2); // 1 draw(p, x, y, w/2); // 2 draw(p, x+w/2, y, w/2); // 3 draw(p, x+w/2, y+w/2, w/2);// 4 } else if (ch == 'f') { for (int i = x; i < x+w; i++) { for (int j = y; j < y+w; j++) { if (MAP[i][j] == 0) MAP[i][j] = 1, cnt++; } } } } int main() { int T; scanf("%d", &T); while (T--) { memset(MAP, 0, sizeof(MAP)); cnt = 0; scanf("%s", s); p = 0; draw(p, 0, 0, 32); scanf("%s", s); p = 0; draw(p, 0, 0, 32); printf("There are %d black pixels.\n", cnt); } return 0; } /* 3 ppeeefpffeefe pefepeefe peeef peefe peeef peepefefe */