UVA Quadtrees

#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、同样是递归建立四分图,递归注意节点及边长的控制
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值