BNUOJ 4049 四叉树

四叉树

Time Limit: 1000ms

Memory Limit: 65536KB

64-bit integer IO format: %lld      Java class name: Main

四叉树是一种常用的数据结构,广泛应用于栅格数据(如地图数据、遥感图像)的压缩编码中。将四叉树扩展到三维就形成了八叉树,可实现三维信息的压缩存储。下面是它的实现原理:

如图是一个8*8图象,如果该图像所有元素都一样(都是0或都是1),就编码为0,再加上公共一样的元素(如01或00)。如果不一样,就先编码为1,然后把图像分成4个4*4图像。继续上面的操作,直到该小区域中,所有像素都是一样的元素为止(当然,最后可能只剩下一个象素点)。最后,(如(d)图)按照剖分的层次,自顶向下,从左至右,把所有的01序列连接起来。如上图,图像的编码为:100101100011000000010100010001 注意:同一层次四个小图象,合并的顺序是:左上、右上、左下,右下,如(d)图所示。 
本题要求同学们编程实现这一编码过程,输出压缩之后的0-1序列。

Input

输入第一行,一个正整数n,一定是2的幂(2、4、8、16等等),最大不超过16 
下面是一个n*n的01矩阵,矩阵的元素只有0和1

Output

输出压缩之后的01序列,一个字符串,只有0和1

Sample Input

8
0 0 0 0 0 0 1 1
0 0 0 0 0 0 1 1
0 0 0 0 0 1 0 0
0 0 0 0 0 1 0 0
1 1 1 1 0 0 0 0
1 1 1 1 0 0 0 0
1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1

Sample Output

100101100011000000010100010001

Source

中国地质大学(北京)第三届程序设计竞赛

解题:直接暴力

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 const int maxn = 16;
 4 int n,mp[maxn][maxn];
 5 bool check(int x,int y,int w) {
 6     for(int i = 0; i < w; ++i) {
 7         for(int j = 0; j < w; ++j)
 8             if(mp[x][y] != mp[i+x][j+y])
 9                 return false;
10     }
11     return true;
12 }
13 string str[18];
14 void dfs(int x,int y,int w,int dep) {
15     string tmp = "1";
16     if(check(x,y,w)) {
17         tmp = "0";
18         if(mp[x][y] == 0) tmp += "0";
19         else tmp += "1";
20         str[dep] += tmp;
21         return;
22     }
23     str[dep] += tmp;
24     dfs(x,y,w>>1,dep+1);
25     dfs(x,y+(w>>1),w>>1,dep+1);
26     dfs(x+(w>>1),y,w>>1,dep+1);
27     dfs(x+(w>>1),y+(w>>1),w>>1,dep+1);
28
29 }
30 int main() {
31     while(~scanf("%d",&n)) {
32         for(int i = 0; i < n; ++i)
33             for(int j = 0; j < n; ++j) {
34                 scanf("%d",mp[i] + j);
35             }
36         for(int i = 0; i < 18; ++i) str[i] = "";
37         dfs(0,0,n,0);
38         for(int i = 1; i <= log2(n); ++i)
39             str[0] += str[i];
40         cout<<str[0]<<endl;
41     }
42     return 0;
43 }

时间: 2024-11-16 13:52:49

BNUOJ 4049 四叉树的相关文章

bnuoj 17184 代数

bnuoj 17184 代数 题意: 现有N个未知数A[1],A[2],-A[N],以及M个方程,每个方程都是形如A[s]+A[s+1]+A[s+2]+-A[t-1]+A[t]=c.现在求解这个方程组. 限制: 1 <= n,m <= 1e5; 1 <= s,t <= N; 0 <= c < 1e9 思路: 带权并查集. 这道题想了好久没想通,最后才知道还可以用并查集做,涨知识了. 感谢http://blog.csdn.net/balloons2012/article/

四叉树算法原理与实现

一.原理 四叉树编码的基本思想是:首先将把一副图像或栅格地图( ,k>1,不足则补网)等分成四个一级字块,顺序为左上,右上,左下,右下:然后逐块检查其中所有格网属性值(或灰度值),若相同,则该字块不再分:若不同,则将该子块进一步分成四个二级子块:如此递归地分割,直到每个子块的属性或灰度均相等为止. 二.算法实现 1 //实现四叉树编码 2 3 #include"stdio.h" 4 void Qutree(int arysize,int level,float curary[]

BNUOJ 1206 A Plug for UNIX

A Plug for UNIX Time Limit: 1000ms Memory Limit: 65536KB This problem will be judged on PKU. Original ID: 108764-bit integer IO format: %lld      Java class name: Main You are in charge of setting up the press room for the inaugural meeting of the Un

BNUOJ 17286 Dollars

Dollars Time Limit: 3000ms Memory Limit: 131072KB This problem will be judged on UVA. Original ID: 14764-bit integer IO format: %lld      Java class name: Main New Zealand currency consists of $100, $50, $20, $10, and $5 notes and $2, $1, 50c, 20c, 1

BNUOJ 34025 -Poor Warehouse Keeper(贪心)

题目:BNUOJ 34025 -Poor Warehouse Keeper(贪心) 题目大意:有一个商品的信息表,上面是数量,下面是总价,然后旁边各有一个按钮.上面的数量按钮按一下数量就加1,然后价格对应的也要在加上一个当前的单价.下面的按钮按一下的话,就对应的总价加1.初始状态是 1 1,然后给出终点状态,问能否得到.可以的话输出最少要按几次按钮,否则输出-1:总价每次输出都是下取整. 解题思路:如果想要尽快的得到总点状态的值,那么就应该按总价的按钮,因为只有总价变大了,商品对因的单价就上升了

Unity 遍历敌人——使用四叉树空间分区

最近看了<游戏编程模式>这本书,里面有一篇空间分区的文章,看了心里痒痒,决定去尝试实现一下.文章后面会给出整个学习参考的链接. 实现的效果如下,我们有一个很大的场景,场景有许许多多的敌人.红色的点代表是玩家,黑色的点代表是敌人.在这样的一个大量敌人的情景下,我们不可能在玩家或敌人寻找身边的攻击对象时穷尽所有的对象.因为我们要建立空间分区,只遍历某个对应区的对象.在图下中,红点中遍历红框中的黑点对象,其他一律不遍历. 接下来我直接放代码了,主要采用了四叉树,如果对于一些不懂的地方断点调试下就可以

BNUOJ 52325 Increasing or Decreasing 数位dp

传送门:BNUOJ 52325 Increasing or Decreasing题意:求[l,r]非递增和非递减序列的个数思路:数位dp,dp[pos][pre][status] pos:处理到第几位 pre:前一位是什么 status:是否有前导零 递增递减差不多思路,不过他们计算的过程中像5555,444 这样的重复串会多算,所以要剪掉.个数是(pos-1)*9+digit[最高位],比如一位重复子串是:1,2,3,4...9,9个,二位重复子串:11,22,33,44,...,99,9个:

[转]一个四叉树Demo学习

程序代码: http://www.codeproject.com/Articles/30535/A-Simple-QuadTree-Implementation-in-C 四叉树: using System; using System.Drawing; using System.Collections.Generic; using System.Diagnostics; namespace QuadTreeLib { /// <summary> /// A Quadtree is a stru

HTML5实现3D和2D可视化QuadTree四叉树碰撞检测

QuadTree四叉树顾名思义就是树状的数据结构,其每个节点有四个孩子节点,可将二维平面递归分割子区域.QuadTree常用于空间数据库索引,3D的椎体可见区域裁剪,甚至图片分析处理,我们今天介绍的是QuadTree最常被游戏领域使用到的碰撞检测.采用QuadTree算法将大大减少需要测试碰撞的次数,从而提高游戏刷新性能,本文例子基于HT for Web的Canvas拓扑图和WebGL的3D引擎组件,通过GraphView和Graph3dView共享同一数据模型DataModel,同时呈现Qua