Quad Trees - ZOJ 1788 四分树

原创 2015年07月08日 18:19:21

Quad Trees

Time Limit: 2 Seconds      Memory Limit: 65536 KB

A binary image, such as the one shown in Figure 2(a), is usually represented as an array of binary entries, i.e., each entry of the array has value 0 or 1. Figure 2(b) shows the array that represents the binary image in Figure 2(a). To store the binary image of Figure 2(b), the so-called quad tree partition is usually used. For an N �� N array, N <= 512 and N = 2^i for some positive integer i, if the entries do not have the same value, then it is partitioned into four N/2 �� N/2 arrays, as shown in Figure 2(c). If an N/2��N/2 array does not have the same binary value, such as the upper right and lower right N/2��N/2 arrays in Figure 2(c), then we can divide it into four N/4��N/4 arrays again. These N/4��N/4 arrays in turn can also, if needed, be divided into four N/8 �� N/8 arrays, etc.. The quad tree partition is completed when the whole array is partitioned into arrays of various size in which each array contains only one binary value. Figure 2(c) contains the arrays after the quad tree partition is completed.


Figure 2: A binary image (a), its array representation (b), its quad tree partition (c), and its quad tree representation (d).

Instead of storing the binary image of Figure 2(a), we only need to store the quad tree in the form as Figure 2(d) which is encoded from Figure 2(c). In Figure 2(d), each node represents an array of Figure 2(c) in which the root node represents the original array. If the value of a node in the tree is 1, then it means that its corresponding array needs to be decomposed into four smaller arrays. Otherwise, a node will have a pair of values and the first one is 0. It means that its corresponding array is not necessary to decompose any more. In this case, the second value is 0 (respectively, 1) to indicate that all the entries in the array are 0 (respectively, 1). Thus, we only need to store the tree of Figure 2(d) to replace storing the binary image of Figure 2(a). The way to store the tree of Figure 2(d) can be represented by the following code:

(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).

This code is just to list the values of the nodes from the root to leaves and from left to right in each level. Deleting the parentheses and commas, we can obtain a binary number 100101100011000000010100010001 which is equal to 258C0511 in hexadecimal. You are asked to design a program for finding the resulting hexadecimal value for each given image.


Input

There is an integer number k, 1 <= k <= 100, in the first line to indicate the number of test cases. In each test case, the first line is also a positive integer N indicating that the binary image is an N �� N array, where N <= 512 and N = 2^i for some positive integer i. Then, an N �� N binary array is followed in which at least one blank is between any two elements.


Output

The bit stream (in hexadecimal) used to code each input array.


Sample Input

3
2
0 0
0 0
4
0 0 1 1
0 0 1 1
1 1 0 0
1 1 0 0
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

0
114
258C0511


题意:按照图示对一个n*n的矩阵进行建树,建完树之后把每层的数字都连接起来,组成一个01的二进制数,然后转化为16进制。

思路:按照四分树的思想去进行dfs。

AC代码如下:

#include<cstdio>
#include<cstring>
#include<string>
#include<iostream>
using namespace std;
int T,t,n,num[520][520],sum[520][520];
string str[12],str2,str3,ans;
char trans[30]={'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};
int check(int x,int y,int len)
{
    int i,j,k,x2=x+len-1,y2=y+len-1;
    k=sum[x2][y2]-sum[x-1][y2]-sum[x2][y-1]+sum[x-1][y-1];
    if(k==0)
      return 0;
    if(k==len*len)
      return 1;
    return -1;
}
void dfs(int x,int y,int len,int p)
{
    int i,j,k;
    k=check(x,y,len);
    if(k==-1)
    {
        str[p]+="1";
        len/=2;
        dfs(x,y,len,p+1);
        dfs(x,y+len,len,p+1);
        dfs(x+len,y,len,p+1);
        dfs(x+len,y+len,len,p+1);
    }
    else if(k==0)
      str[p]+="00";
    else if(k==1)
      str[p]+="01";
}
void print()
{
    int i,j,k,len,ret;
    str2=str3=ans="";
    for(i=1;i<=10;i++)
       str2+=str[i];
    len=str2.length();
    if(len%4!=0)
      for(i=1;i<=4-len%4;i++)
         str3+="0";
    str3+=str2;
    len=str3.length();
    for(i=3;i<len;i+=4)
    {
        ret=0;
        for(j=0;j<4;j++)
           ret+=(str3[i-j]-'0')<<j;
        printf("%c",trans[ret]);
    }
    printf("\n");
}
int main()
{
    int i,j,k;
    scanf("%d",&T);
    for(t=1;t<=T;t++)
    {
        scanf("%d",&n);
        for(i=1;i<=n;i++)
           for(j=1;j<=n;j++)
              scanf("%d",&num[i][j]);
        for(i=1;i<=n;i++)
           for(j=1;j<=n;j++)
              sum[i][j]=sum[i][j-1]+num[i][j];
        for(i=1;i<=n;i++)
           for(j=1;j<=n;j++)
              sum[i][j]=sum[i-1][j]+sum[i][j];
        for(i=0;i<=10;i++)
           str[i]="";
        dfs(1,1,n,1);
        print();
    }
}



相关文章推荐

ZOJ 1788 Quad Trees (朴素BFS)

任意门:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=788   给一个二进制黑白图像,进行压缩.且图像是以2^i ...

zoj 1788 Quad Trees

四分树的题目 利用dfs建立一棵四分树。 然后bfs遍历四分树。 最后把遍历结果转换为十六进制输出。 #include #include #include #include #in...

ACM zoj 1955(四分树实现)

这是道方阵颜色分割的题目,因而可以用四分树来解决。其实这道题对我来说,难点在于将要分割的颜色提取出来,因为当你遇到Q时说明你要将后面的颜色分成四块,如果在这之中又出现Q的话,那你就要用同样的方法将Q后...

UVa 712/POJ 1105/ZOJ 1150 S-Trees(用数组模拟二叉树)

712 - S-Trees Time limit: 3.000 seconds A Strange Tree (S-tree) over the variable set  is a binary ...

zoj 3602 Count the Trees 二叉树HASH 浙江省第9届大学生程序设计竞赛 第三题

记左儿子对应的hash值为a,右儿子对应的hash值为b,使val=hash(a,b) {hash(a,b)=find(a,b)?hashval:cnt++;},则每种形状的树的表示是存在且唯一的。 ...

zoj 3602 Count the Trees 树的同构

/* 二叉树的同构 把每棵子树映射为一个整数 如节点n的左右孩子为L,R,那么取子树L对应的整数Ln 子树R对应的整数Rn,把pair(Ln,Rn)对应为一个整数就是 当前子树的映射 */ #inc...

ZOJ--3602--Count the Trees【DFS+Hash】树的同构

链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3602 题意:给出一棵有n个节点的二叉树和一棵有m个节点的二叉树,给...
  • zzzz40
  • zzzz40
  • 2014年09月05日 16:54
  • 759

ZOJ 3602 Count the Trees(二叉树)

计算两棵二叉树构造相同的子树有几对 但一个节点的左右节点都有对应的hash值的时候,才可以对其赋值,否则 对未赋值的子树进行dfs,最后统计个数,用乘法定理 #include #inclu...
  • pootree
  • pootree
  • 2016年03月02日 18:54
  • 83

ZOJ 3602 Count the Trees 树的同构 (哈希)

链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=4705 题意:给出两棵二叉树A和B,问分别处于A中的子树a和处于B中的子...

四分树切割算法MATLAB代码

  • 2011年01月11日 10:43
  • 463KB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Quad Trees - ZOJ 1788 四分树
举报原因:
原因补充:

(最多只允许输入30个字)