bnuoj_4049 四叉树
2016-07-08 20:21
381 查看
四叉树是一种常用的数据结构,广泛应用于栅格数据(如地图数据、遥感图像)的压缩编码中。将四叉树扩展到三维就形成了八叉树,可实现三维信息的压缩存储。下面是它的实现原理:
如图是一个8*8图象,如果该图像所有元素都一样(都是0或都是1),就编码为0,再加上公共一样的元素(如01或00)。如果不一样,就先编码为1,然后把图像分成4个4*4图像。继续上面的操作,直到该小区域中,所有像素都是一样的元素为止(当然,最后可能只剩下一个象素点)。最后,(如(d)图)按照剖分的层次,自顶向下,从左至右,把所有的01序列连接起来。如上图,图像的编码为:100101100011000000010100010001 注意:同一层次四个小图象,合并的顺序是:左上、右上、左下,右下,如(d)图所示。
本题要求同学们编程实现这一编码过程,输出压缩之后的0-1序列。
输入第一行,一个正整数n,一定是2的幂(2、4、8、16等等),最大不超过16
下面是一个n*n的01矩阵,矩阵的元素只有0和1
输出压缩之后的01序列,一个字符串,只有0和1
如图是一个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
//简单深搜,关键在dep和string数组的结合 #include<string> #include<iostream> #include<cmath> using namespace std; const int maxn=16; int a[maxn][maxn]; string str[maxn];//log2(n)大小就行但竟RE...(数据中n应大于16,,,) bool jud(int r,int l,int w){ //r,l起点,w宽度 for(int i=r;i<r+w;i++) for(int j=l;j<l+w;j++) if(a[i][j]!=a[r][l]) return false; return true; } void dfs(int r,int l,int w,int dep){ //dep树的深度 if(jud(r,l,w)){ str[dep]+="0"; if(a[r][l]==1) str[dep]+="1"; else str[dep]+="0"; return; } str[dep]+="1"; dfs(r,l,w>>1,dep+1); dfs(r,l+(w>>1),w>>1,dep+1); dfs(r+(w>>1),l,w>>1,dep+1); dfs(r+(w>>1),l+(w>>1),w>>1,dep+1); return; } int main(){ int n; cin>>n; for(int i=0;i<n;i++) for(int j=0;j<n;j++) cin>>a[i][j]; for(int i=0;i<maxn;i++) str[i]=""; dfs(0,0,n,0); for(int i=1;i<=log2(n);i++) str[0]+=str[i]; cout<<str[0]<<endl; return 0; }
相关文章推荐
- Java线程经典面试题
- 《Pro Express.js》学习笔记——Express框架常用设置项
- spark 1.6.0 core源码分析4 worker启动流程
- Java基础之多线程断点下载
- 学习ACM之路-大数的幂运算
- 记一下要学的内容
- 网络爬虫之投票
- 0708学习记录
- diy数据库(十)--索引
- iOS SVProgressHUD 简单使用
- 校外实习-7.8
- 个人记事本
- Lightoj 1029 - Civil and Evil Engineer
- C++ primer (2) —— 基础
- Android Loader解析
- leetcode: Sort List
- 酷酷头像技术支持
- hdu 1212 Big Number(大数取模)
- Spark中RDD的常用操作(Python)
- 回家