UVA.297 Quadtrees (四分树 DFS)
UVA.297 Quadtrees (四分树 DFS)
题意分析
将一个正方形像素分成4个小的正方形,接着根据字符序列来判断是否继续分成小的正方形表示像素块。字符表示规则是: 
p表示这个像素块继续分解,e表示当前方格没有像素,即为空,f表示当前像素块为满,黑色。 
最后求解两个数合并后的像素块的数量是多少。 
最大的像素块数量是1024个。
采用数组模拟,根据所给的字符串,递归建树。字符数组的建四分树的技巧是(k << 2) + i i∈[-2,1]。 这样就可以充分利用数组的空间。 
两树合并的技巧,对于某一节点,如果有一个节点的值为0,另一个对应节点的值为非0,那么这个节点合并后的值就为非0值。 或者是当前节点的像素块为此深度所能到达的最大值,那么合并后即为这个深度的最大值。否则的话,继续向下递归合并。 
最后输出合并后的结果即可。
代码总览
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <string>
#include <sstream>
#include <queue>
#include <stack>
#include <set>
#include <map>
#include <vector>
#define nmax 1200
#define standerd 1024
#define hh standerd / (1<<((depth-1)*2))
#define INF 0x3f3f3f3f
using namespace std;
int ta[nmax<<2],tb[nmax<<2];
char str[10000];
int pos = 0;
void pushup(int rt, int t[])
{
    int sum = 0;
    for(int i = -2; i<=1; ++i)
        sum+=t[(rt<<2)+i];
    t[rt] = sum;
}
void dfs(int t[],int rt,int depth)
{
    if(str[pos] == 'e') {
        return;
    }
    if(str[pos] == 'f') {
        t[rt] = hh;
    }
    if(str[pos] == 'p'){
        for(int i = -2; i<=1; ++i){
            pos++;
            dfs(t,(rt<<2)+i,depth+1);
            pushup(rt,t);
        }
    }
}
bool judge(int depth, int rt)
{
    if(ta[rt] == hh || tb[rt] == hh) return true;
    else return false;
}
int cal(int t1[], int t2[],int rt,int depth, int sum)
{
    if((!t1[rt] || !t2[rt])|| judge(depth,rt))
        sum = max(t1[rt],t2[rt]);
    else
        for(int i = -2; i<=1; ++i)
            sum += cal(t1,t2,(rt<<2)+i,depth+1,0);
    return sum;
}
int main()
{
//    freopen("in.txt","r",stdin);
//    freopen("out.txt","w",stdout);
    int t;
    scanf("%d",&t);
    while(t--){
        memset(ta,0,sizeof(ta));
        memset(tb,0,sizeof(tb));
        pos = 0;
        scanf("%s",str);
        dfs(ta,1,1);
        pos = 0;
        scanf("%s",str);
        dfs(tb,1,1);
        int sum = cal(ta,tb,1,1,0);
        printf("There are %d black pixels.\n",sum);
    }
    return 0;
}
UVA.297 Quadtrees (四分树 DFS)的更多相关文章
- UVa 297 Quadtrees(树的递归)
		Quadtrees 四分树就是一颗一个结点只有4个儿子或者没有儿子的树 [题目链接]UVa 297 Quadtrees [题目类型]树的递归 &题意: 一个图片,像素是32*32,给你两个先序 ... 
- UVA - 297 Quadtrees (四分树)
		题意:求两棵四分树合并之后黑色像素的个数. 分析:边建树边统计. #include<cstdio> #include<cstring> #include<cstdlib& ... 
- uva 297 quadtrees——yhx
		Quadtrees A quadtree is a representation format used to encode images. The fundamental idea behind ... 
- UVa 297 - Quadtrees
		题目:利用四叉树处理图片,给你两张黑白图片的四叉树,问两张图片叠加后黑色的面积. 分析:搜索.数据结构.把图片分成1024块1*1的小正方形,建立一位数组记录对应小正方形的颜色. 利用递归根据字符串, ... 
- UVA 297 Quadtrees(四叉树建树、合并与遍历)
		<span style="font-size: 18pt; font-family: Arial, Helvetica, sans-serif; background-color: r ... 
- UVa 297 Quadtrees    -SilverN
		A quadtree is a representation format used to encode images. The fundamental idea behind the quadtre ... 
- Quadtrees(四分树)
		uva 297 Quadtrees Time Limit: 3000MS Memory Limit: Unknown 64bit IO Format: %lld & %llu Subm ... 
- 四分树 (Quadtrees UVA - 297)
		题目描述: 原题:https://vjudge.net/problem/UVA-297 题目思路: 1.依旧是一波DFS建树 //矩阵实现 2.建树过程用1.0来填充表示像素 #include < ... 
- UVa 297 (四分树 递归) Quadtrees
		题意: 有一个32×32像素的黑白图片,用四分树来表示.树的四个节点从左到右分别对应右上.左上.左下.右下的四个小正方区域.然后用递归的形式给出一个字符串代表一个图像,f(full)代表该节点是黑色的 ... 
随机推荐
- Python3.6+selenium3.8+Firefox5.7 环境搭建
			大家好,我是阿哲,本人是从php转岗过来学习测试的一名小菜! 在学习selenium过程中,发现运行selenium有很多的问题. 我们在利用pip install selenium 安装的最新版后, ... 
- Linux命令应用大词典-第45章 服务器配置
			45.1 ssh-agent:存储用于公钥验证的私钥 45.2 ssh-add:添加RSA或DSA身份的认证代理 45.3 ssh-keyscan:收集主机公钥 45.4 sshd:运行sshd守护进 ... 
- TPO-16 C1 Reserve the room for a rehearsal
			TPO-16 C1 Reserve the room for a rehearsal 第 1 段 1.Listen to a conversation between a Student and a ... 
- unity初探之黑暗之光(2)
			unity初探之黑暗之光(2) 一.设置角色跟随鼠标点击移动 思路:使用charactercollider的SimpleMove方法来控制角色的移动.通过摄像机的射线投射到地面,通过屏幕上的一个点也就 ... 
- [Clr via C#读书笔记]Cp13接口
			Cp13接口 类和接口继承 接口只提供签名,不提供实现:等效于契约:凡事能使用具名接口的地方都能够使用实现了的接口. 定义接口 定义很简单,FCL也提供了大量的现成接口供使用: 继承接口 类不能多继承 ... 
- 【机器学习】多项式回归sklearn实现
			[机器学习]多项式回归原理介绍 [机器学习]多项式回归python实现 [机器学习]多项式回归sklearn实现 使用sklearn框架实现多项式回归.使用框架更方便,可以少写很多代码. 使用一个简单 ... 
- day21 TFRecord格式转换MNIST并显示
			首先简要介绍了下TFRecord格式以及内部实现protobuf协议,然后基于TFRecord格式,对MNIST数据集转换成TFRecord格式,写入本地磁盘文件,再从磁盘文件读取,通过pyplot模 ... 
- array.some() 方法兼容ie8
			在第 5 版时,some 被添加进 ECMA-262 标准:这样导致某些实现环境可能不支持它.你可以把下面的代码插入到脚本的开头来解决此问题,从而允许在那些没有原生支持它的实现环境中使用它.该算法是 ... 
- Java 抽象类和Final关键字
			抽象类 用abstract关键字来修饰一个类时,这个类叫抽象类: 用abstract关键字来修饰一个方法时,该方法叫做抽象方法. 含有抽象方法的类必须被定义而为抽象类,抽象类必须被继承,抽象方法必须被 ... 
- android入门 — ListView的优化
			ListView的运行效率是比较低的,因为在getView()中每次都会将整个布局重新加载一遍,当ListView快速滚动的时候就会成为性能瓶颈. 调用View中的findViewById()方法获取 ... 
