1.由二维空间图像得到其压缩编码
传送门
//建树加遍历
int p[1025][1025];
int node[1025*1025];
int build(int k,int lx,int ly,int rx,int ry)
{
if(lx==rx&&ly==ry)
return node[k]=(1<<p[ly][lx]); //该块为黑色 则节点值为1, 为白色 节点值为2
int mx=(lx+rx)/2,my=(ly+ry)/2;
int v=0;
//计算四个子矩阵。或运算,如果四个子矩阵均为黑,则v=1,均为白,则为2,有黑有白则为3
//同时也放方便进行遍历。v==3的时候继续向下遍历,否则输出。
v|=build(k*4,lx,ly,mx,my);
v|=build(k*4+1,mx+1,ly,rx,my);
v|=build(k*4+2,lx,my+1,mx,ry);
v|=build(k*4+3,mx+1,my+1,rx,ry);
return node[k]=v;
}
//cout<<"123"<<endl;
void dfs(int u)
{
if(node[u]==3)
{
if(u>1)
putchar('*');
dfs(4*u);
dfs(4*u+1);
dfs(4*u+2);
dfs(4*u+3);
}
else
{
if(node[u]==2)
putchar('1');
else
putchar('0');
}
}
2.由压缩编码得到其二维图像
传送门
//由树建图
char g[1025][1025];
char line[10000];
int idx;
void build(int k,int lx,int ly,int rx,int ry)
{
char type=line[idx++];
if(type=='*')
{
int mx=(lx+rx)>>1,my=(ly+ry)>>1;
build(k*4,lx,ly,mx,my);
build(k*4+1,mx+1,ly,rx,my);
build(k*4+2,lx,my+1,mx,ry);
build(k*4+2,mx+1,my+1,rx,ry);
}
else
{
for(int i=ly;i<=ry;i++)
for(int j=lx;j<=rx;j++)
g[i][j]=type;
}
}