您的位置:首页 > 其它

uva 297 Quadtrees

2013-10-07 14:59 363 查看
二叉树的先序遍历题目,不需要建立二叉树,用两个一维数组模拟像素的位置就行了,最后归并两个一维数组中的内容就行了。调试还真花了点时间,递归程序一定要谨慎地写代码,要不然很容易出现漏洞。

#include <stdio.h>
#include <string.h>
#include <math.h>
#define		MAX_LEN		10000

char buffer1[MAX_LEN];
char buffer2[MAX_LEN];

unsigned char black1[1025];
unsigned char black2[1025];

int buffer_index;

//start_addr是当前的树的第一个叶子节点的起始下标
void pre_travel(char *buffer, int depth, int start_addr)
{
int aver; //四个子树里面每个子树涵盖多少个点
aver = 1024/(int)pow(4.0, depth);

if(buffer[buffer_index] == 'f')
{
if(buffer == buffer1)
memset(black1+start_addr, 1, aver);
else if(buffer == buffer2)
memset(black2+start_addr, 1, aver);

return;
}

if(buffer[buffer_index] == 'e')
{
return;
}

if(buffer[buffer_index] == 'p')
{
buffer_index++;
pre_travel(buffer, depth+1, start_addr);
buffer_index++;
pre_travel(buffer, depth+1, start_addr+aver/4);
buffer_index++;
pre_travel(buffer, depth+1, start_addr+aver/4*2);
buffer_index++;
pre_travel(buffer, depth+1, start_addr+aver/4*3);
}
}

void func()
{
int i, count;

memset((void*)black1, 0, 1025);
memset((void*)black2, 0, 1025);

buffer_index = 0;
pre_travel(buffer1, 0, 1);
buffer_index = 0;
pre_travel(buffer2, 0, 1);

count = 0;
for(i=1; i<=1024; i++)
if(black1[i] || black2[i])
count ++;

printf("There are %d black pixels.\n", count);
}

int main(void)
{
int n, i;

//freopen("input.dat", "r", stdin);

scanf("%d", &n);
getchar();
for(i=0; i<n; i++)
{
gets(buffer1);
gets(buffer2);
func();
}

return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  acm uva