题意:对于一个0,1矩阵,如果该矩阵全都是一种颜色,那么就在树上表示为(0,1)or(0,0)第二个值看对应区域的颜色是0还是1了,如果颜色不同就在树上标记为1,并且继续细分直到该区域颜色全都相同为止,分法就是把当前区域平均分成4份,如图所示。
求,对于的树的从上倒下,把数据写成一排,如题目图的树,每层分别为,1,001011,000110000000101,00010001,连接在一块就成了一个二进制数,100101100011000000010100010001,把这个二进制数以16进制输出
bfs求解
#include <bits/stdc++.h>
using namespace std;
#define maxn 520
struct node
{
int x,y;
int len;
};
int d[maxn][maxn];
queue<int> dd;
queue<node> qq;
int mapp[maxn][maxn][10];
int check(int x,int y,int len)
{
if (len==1){
mapp[x][y][1]=0;
return d[x][y];
}
int a1,a2,a3,a4;
a1=check(x,y,len/2);
a2=check(x,y+len/2,len/2);
a3=check(x+len/2,y,len/2);
a4=check(x+len/2,y+len/2,len/2);
if (a1!=2&&a1==a2&&a1==a3&&a1==a4){
mapp[x][y][len]=0;
return d[x][y];
}
mapp[x][y][len]=1;
return 2;
}
int main()
{
//freopen("in.txt","r",stdin);
//freopen("out.txt","w",stdout);
int kk;scanf("%d",&kk);
while(kk--){
int n;scanf("%d",&n);
for (int i=1;i<=n;i++){
for (int j=1;j<=n;j++){
scanf("%d",&d[i][j]);
}
}
check(1,1,n);
if (mapp[1][1][n]){
node as;
as.x=1;as.y=1;as.len=n;
qq.push(as);
dd.push(1);
}
while(!qq.empty()){
node as=qq.front();
qq.pop();
node a1,a2,a3,a4;
a1.x=as.x;a1.y=as.y;a1.len=as.len/2;
a2.x=as.x;a2.y=as.y+as.len/2;a2.len=as.len/2;
a3.x=as.x+as.len/2;a3.y=as.y;a3.len=as.len/2;
a4.x=as.x+as.len/2;a4.y=as.y+as.len/2;a4.len=as.len/2;
int d1,d2,d3,d4;
d1=mapp[a1.x][a1.y][a1.len];
d2=mapp[a2.x][a2.y][a2.len];
d3=mapp[a3.x][a3.y][a3.len];
d4=mapp[a4.x][a4.y][a4.len];
if (d1){
qq.push(a1);
dd.push(1);
}
else
{
dd.push(0);
dd.push(d[a1.x][a1.y]);
}
if (d2){
qq.push(a2);
dd.push(1);
}
else
{
dd.push(0);
dd.push(d[a2.x][a2.y]);
}
if (d3){
qq.push(a3);
dd.push(1);
}
else
{
dd.push(0);
dd.push(d[a3.x][a3.y]);
}
if (d4){
qq.push(a4);
dd.push(1);
}
else
{
dd.push(0);
dd.push(d[a4.x][a4.y]);
}
}
int sum=0;
while(!dd.empty()){
sum=sum*2+dd.front();
dd.pop();
}
stack<char> ans;
if (sum==0){
ans.push('0');
}
while(sum>0){
int data=sum%16;
if (data<10){
ans.push(data+'0');
} else ans.push(data-10+'A');
sum=sum/16;
}
while(!ans.empty()){
printf("%c",ans.top());
ans.pop();
}
printf("\n");
}
return 0;
}
本文介绍了一种针对二进制矩阵的树状编码算法,通过递归地将矩阵分解为子矩阵并记录每个子矩阵的状态来形成一棵树。然后使用广度优先搜索遍历这棵树,并将遍历得到的数据串接成一个二进制字符串,最后将其转换为十六进制形式输出。
1394

被折叠的 条评论
为什么被折叠?



