UVa 297 Quadtrees

思路分析:

根据先序序列建立整个树,因为根据颜色即可判断结点有无孩子,即可知道序列中接下来的结点是不是子结点。

因为要把两个树加起来,只需要遍历两个字符串对应的二叉树即可,然后在同一个表示图的二维数组上叠加即可。

注意:对二维数组用fill()函数时候,首地址用buf[0]

题解:

#include <cstdio>
#include <algorithm>
using namespace std;
const int MAX = 1024+10;
const int len = 32;
char s[MAX];
int buf[len][len] = {0}, cnt;

void draw(const char* s, int &p, int r, int c, int w){//在左上角为r,c宽度为w的正方形中画图,在字符串中位置为p, 
	char ch = s[p++];
	if(ch == 'p'){
		draw(s, p, r+w/2, c,     w/2);
		draw(s, p, r,     c,     w/2);
		draw(s, p, r,     c+w/2, w/2);
		draw(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(!buf[i][j]){
					buf[i][j] = 1;
					cnt++;				
				}
			}
		}
	}
}

int main(){
	int T;
	scanf("%d", &T);
	while(T--){
		cnt = 0;
		fill(buf[0], buf[0]+32*32, 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;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值