四分树

2024-02-14 00:20
文章标签 四分

本文主要是介绍四分树,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

2:四分树

总时间限制: 
1000ms 
内存限制: 
65536kB
描述

一幅如图2(a)所示的二进制图片常常会用一个二进制矩阵来表示。所谓二进制矩阵是指矩阵中的每一个数不是0就是1。图2(b)展示图2(a)用二进制矩阵表示的情况。


图2:(a)二进制图片(b)图片的矩阵表示(c)四分树划分(d)四分树表示

 

为了保存图2(b)这样的矩阵,经常使用四分树来完成。对于一个N * N的矩阵,N <= 512且N = 2^i(i为正整数),如果这个矩阵中的数不全一样,那么我们会把这个矩阵分成4个N/2 * N/2的矩阵,如图2(c)所示。之后,我们再对这4个N/2 * N/2的矩阵划分,同样地,如果里面的数不全一样则划分成N/4 * N/4的矩阵。图2(c)里面右边的两个N/2 * N/2的矩阵就被这样再度划分了。如此可以持续进行划分,直到里面的数全一样。图2(c)展示了完全划分完毕的样子。

我们一般都将二进制图片存成图2(d)这样的四分树的形式,这棵树是通过图2(c)里面的划分得到的。图2(d)里面的每一个结点都代表图2(c)里面的矩阵,而树的根结点代表整个大的矩阵。如果树中一个结点的值为1,则代表这个结点对应的矩阵需要划分成4个小矩阵。否则,这个结点将包含两个数。第一个数为0,表示不用再划分,第二个数为0或者1,表示整个矩阵都是这个值。整棵树可以用它的宽度优先遍历得到的结果来表示,如图2(d)中的树可以表示成(1)(0,0)(1)(0,1)(1)(0,0)(0,1)(1)(0,0)(0,0)(0,0)(0,1)(0,1)(0,0)(0,1)(0,0)(0,1)。删掉括号和逗号,我们可以得到一个更简短的纯二进制编码100101100011000000010100010001来编码这张图片,它的16进制形式为258C0511。

现在请你编写一个程序,求出给定图片的16进制形式的编码。

 


输入
第1行包含一个数k,1 <= k <= 100,表示数据的组数。
对于每一组数据,第1行包含一个数N表示图片的大小为N * N,其中N <= 512且N = 2^i(i为正整数)。
接下来跟着一个N * N的矩阵代表一张二进制图片。每两个0和1之间至少有一个空格。
输出
每张图片通过四分树得到的16进制编码。
样例输入
320 00 040 0 1 10 0 1 11 1 0 01 1 0 080 0 0 0 0 0 1 10 0 0 0 0 0 1 10 0 0 0 0 1 0 00 0 0 0 0 1 0 01 1 1 1 0 0 0 01 1 1 1 0 0 0 01 1 1 1 1 1 1 11 1 1 1 1 1 1 1
样例输出
0114258C0511
#include<iostream>
#include<cmath>
#include<cstring>
#include<algorithm>
#include<iomanip>
#include<queue>
#include<stack>
#include<vector>
#include<set>
#include<map>
using namespace std;
char Map[513][513];
struct Node
{string s;Node*Child[4];Node(){s="";memset(Child,0,sizeof(Child));}
};
Node*root;
int Check(int x,int y,int size)
{int num0=0,num1=0;for(int i=x;i<x+size;++i)for(int j=y;j<y+size;++j) {if(Map[i][j]=='0')num0++;else num1++;}if(num0==0)return 1;if(num1==0)return 0;return -1;
}
Node*dfs(int x,int y,int size)
{Node* p=new Node();if(size==1){	p->s="0";p->s+=Map[x][y];return p;}int tag=Check(x,y,size);if(tag==0){p->s="00";return p;}if(tag==1){p->s="01";return p;}p->s="1";int len=size>>1;p->Child[0]=dfs(x,y,len);p->Child[1]=dfs(x,y+len,len);p->Child[2]=dfs(x+len,y,len);p->Child[3]=dfs(x+len,y+len,len);return p;
}
void Print(int x)
{if(x<=9)cout<<x;else if(x==10)cout<<"A";else if(x==11)cout<<"B";else if(x==12)cout<<"C";else if(x==13)cout<<"D";else if(x==14)cout<<"E";else if(x==15)cout<<"F";
}
void bfs(Node*root)
{queue<Node*>q;q.push(root);string s="";while(!q.empty()){Node*tmp=q.front();q.pop();s+=tmp->s;for(int i=0;i<4;++i){if(tmp->Child[i]!=NULL){q.push(tmp->Child[i]);}}}int len=s.length();int pre=len%4;int sum=0,x=1;if(pre>0){for(int i=pre-1;i>=0;--i){sum+=x*(s[i]-'0');x<<=1;}Print(sum);}for(int i=pre;i<len;i+=4){sum=0;x=1;for(int j=i+3;j>=i;--j){sum+=x*(s[j]-'0');x<<=1; }Print(sum);}cout<<endl;
}
int main()
{int Test;cin>>Test;while(Test--) {int n;cin>>n;for(int i=0;i<n;++i){for(int j=0;j<n;++j){cin>>Map[i][j];}}root=dfs(0,0,n);bfs(root);}return 0;
}


这篇关于四分树的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/707007

相关文章

科研绘图系列:R语言差异基因四分图(Quad plot)

介绍 四分图(Quad plot)是一种数据可视化技术,通常用于展示四个变量之间的关系。它由四个子图组成,每个子图都显示两个变量之间的关系。四分图的布局通常是2x2的网格,每个格子代表一个变量对的散点图。 在四分图中,通常: 第一个子图显示变量A和B的关系。第二个子图显示变量A和C的关系。第三个子图显示变量A和D的关系。第四个子图显示变量B和C的关系。 此外,第四个子图也可以显示变量

科研绘图系列:R语言单细胞差异基因四分图(Quad plot)

介绍 在单细胞分析领域,为了探究不同分组间同一细胞类型的基因表达差异,研究者们常采用四分图(Quad Plot)作为分析工具。该图形的横轴代表比较组1,而纵轴代表比较组2。通过这种布局,四分图能够有效地展示两组间共有的差异表达基因,从而为深入理解细胞类型在不同条件下的分子特性提供直观的视角。这种可视化方法不仅揭示了组间基因表达的异同,还有助于识别可能在生物学过程或疾病发生中起关键作用的基因。

【异常分析:四分位距与3σ原则】

文章目录 前言四分位距(IQR)3σ原则使用步骤计算四分位距应用3σ原则 代码 前言 异常分析的目标是识别数据中的异常值,这些异常值可能是由于错误的记录、设备故障或者其他未知原因导致的。四分位距(interquartile range, IQR)和3σ原则(3 sigma rule)是两个常用的工具。 四分位距(IQR) 四分位距是统计学中用于度量数据离散程度的一种方法。它

2016年认证杯SPSSPRO杯数学建模D题(第二阶段)NBA是否有必要设立四分线全过程文档及程序

2016年认证杯SPSSPRO杯数学建模 D题 NBA是否有必要设立四分线 原题再现:   NBA 联盟从 1946 年成立到今天,一路上经历过无数次规则上的变迁。有顺应民意、皆大欢喜的,比如 1973 年在技术统计中增加了抢断和盖帽数据;有应运而生、力挽狂澜的,比如 1954 年引入 24 秒进攻时限;有因人废事、“打击迫害”的,比如为了限制麦肯,将三秒区宽度从 6 英尺扩大到 12 英尺

2016年认证杯SPSSPRO杯数学建模D题(第一阶段)NBA是否有必要设立四分线解题全过程文档及程序

2016年认证杯SPSSPRO杯数学建模 D题 NBA是否有必要设立四分线 原题再现   NBA 联盟从 1946 年成立到今天,一路上经历过无数次规则上的变迁。有顺应民意、皆大欢喜的,比如 1973 年在技术统计中增加了抢断和盖帽数据;有应运而生、力挽狂澜的,比如 1954 年引入 24 秒进攻时限;有因人废事、“打击迫害”的,比如为了限制麦肯,将三秒区宽度从 6 英尺扩大到 12 英尺,

pandas寻找四分位数及判断离群点

import pandas as pdtrain_df = pd.read_csv("train.csv")q1, q3 = train_df['price'].quantile([0.25, 0.75])iqr = q3 - q1outlier = train_df[(train_df['price'] > q3 + iqr * 1.5) | (train_df['price'] < q

python 四分卫数_NFL 2020预览与Python四分卫

python 四分卫数 NFL 2020 season is coming soon. For preview this season, I’m going to visualize some quarterbacks data using 2019 dataset. NFL 2020赛季即将到来。 为了预览本季,我将使用2019年数据集可视化一些四分卫数据。 1.概述 (1. O

NFL 2020预览与Python四分卫

NFL 2020 season is coming soon. For preview this season, I’m going to visualize some quarterbacks data using 2019 dataset. NFL 2020赛季即将到来。 为了预览本季,我将使用2019年数据集可视化一些四分卫数据。 1.概述 (1. Overview) In