您的位置:首页 > 其它

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序列。 

 


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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: