###### Quad Trees - ZOJ 1788 四分树

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

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();
}
}


2014-04-14 14:41:49

#### zoj - 1788 - Quad Trees（四分树）

2012-11-01 01:26:56

2012-11-14 11:40:34

2015-12-08 13:44:38

#### poj1623 象限四分树

2015-06-22 14:21:59

2016-12-04 11:24:19

#### ZOJ3602 Count the Trees STL 树的同构

2012-12-17 22:46:48

#### ACM zoj 1955(四分树实现)

2012-11-27 15:31:03

#### Quadtree - ZOJ 1955 四分树

2015-07-08 16:34:33

## 不良信息举报

Quad Trees - ZOJ 1788 四分树