UVA - 297 Quadtrees

/*
  代码虽然极其简短,但看懂也是不易,我觉得自己就思考了挺久,才彻底弄懂。所以做好心理准备,不要因为它似乎简短就轻视它,多多揣摩一下!~
  
  四分树比较特殊,只需给出先序遍历就能确定整棵树(因为每棵树的每个子节点,都会分出4个节点,也即4个字母,除非递归走到叶子节点。当然,还除非都是同色,那该子树就只用1个字母表示了)
  
  所以只需要编写一个"画出来的"过程,边画边统计即可
*/


#include <cstdio>
#include <cstring>
const int len = 32;
const int maxn = 1024 + 10;

char s[maxn];
int buf[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 (buf[i][j] == 0)
		{
			buf[i][j] = 1;
			cnt++;
		} 
	} 
}
//(r, c)是(row, col)的简写,表示左上角的坐标(“其实严格意义上来说,并不是坐标,而是下标,亦即在把它当作二维数组时,它的两个下标依次是 r, c”)
//所以,先表示左上角所在行,再表示左上角所在列。刚开始我理解错误,将其理解为笛卡尔系下的坐标平面,就觉得这些代码,怎么看怎么不对劲,后来顿悟了,是我理解错了(r, c)的意义
 
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.\n", cnt);
	}
	return 0;
}

posted @ 2017-09-23 23:55  mofushaohua  阅读(122)  评论(0编辑  收藏  举报