UVA ~ 297 ~ Quadtrees (四分树)

本文介绍了一种使用四分树表示和处理32x32黑白图像的方法,通过给出两棵树的先序遍历,实现黑色部分的合并并计算最终黑色像素的数量。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题意:如图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
*/



笛卡尔,也称为四叉Quadtrees),是一种数据结构,用于空间分割和高效检索。以下是C语言实现一个简单的笛卡尔的伪代码示例,实际完整版代码会包括更多的错误处理和边界情况: ```c #include <stdio.h> #include <stdlib.h> typedef struct Node { int value; struct Node *north; // 北方节点 struct Node *east; // 东方节点 struct Node *south; // 南方节点 struct Node *west; // 西方节点 } TreeNode; // 创建新节点 TreeNode* createNode(int value) { TreeNode* newNode = (TreeNode*)malloc(sizeof(TreeNode)); newNode->value = value; newNode->north = NULL; newNode->east = NULL; newNode->south = NULL; newNode->west = NULL; return newNode; } // 分割函数,递归创建四个子节点 TreeNode* splitNode(TreeNode* node, int width, int height) { if (width * height <= 1) { return node; } int midWidth = width / 2; int midHeight = height / 2; TreeNode* north = createNode(0); node->north = north; TreeNode* east = createNode(0); node->east = east; TreeNode* south = createNode(0); node->south = south; TreeNode* west = createNode(0); node->west = west; // 根据坐标值填充子节点 // 这部分需要根据具体的应用逻辑来实现,例如基于像素值、索引或其他条件 return north; } int main() { // 初始化示例,这里只是一个基本框架 TreeNode* root = createNode(0); // 根节点 int width = 8; // 的高度和宽度 int height = 8; root = splitNode(root, width, height); // 打印或遍历的操作... free(root); // 清理内存 return 0; }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值