Sample Input
3
4 (1,1) (1,1) (4,1) (4,1) (1,3) (2,4)
15
8 (1,1) (4,4) (3,5) (7,6) (1,7) (2,8) (3,8) (3,8) (5,7) (6,8)
Sample Output
*1000*010010
Size is invalid
10*011*0010*1*101010
题解:2018_2_11_Creating a Quadtree_四叉树_ujn20161222的博客-CSDN博客
1.判别矩阵合法与否
设矩阵的规模为n。 如果n*n的矩阵能够按照“等分四个子区域”的规则递归至像素,则n一定是2的次幂,即n≥2且n仅有1个二进制位为1。否则,n*n的矩阵是不可能细分至像素的,应输出非法信息("Size is invalid")并退出。
2.构造合法矩阵对应的四叉树
首先根据题目给出的每对坐标(同色子矩阵的左上角坐标和右下角坐标),构造01位图g[ ][ ]
然后,按照后序遍历的方法构造与01位图g[ ][ ]相对应的四叉树: 设四叉树的根节点为1,代表左上角为( 0, 0 ),右下角为( n-1, n-1 )的子矩阵;设根或分支节点k,代表左上角为( lx, ly ),右下角为( rx, ry )的子矩阵(0 ≤ lx ≤ rx ≤ n-1,0 ≤ ly ≤ ry ≤ n-1 )。
按访问区域的顺序由左到右,自上而下,节点k的4个孩子分别如图:
- 节点4*k代表左上子矩阵(以(lx, ly)为左上角、(mx, my)为右下角);
- 节点4*k+1代表右上子矩阵(以(mx +1, ly)为左上角、(rx, my)为右下角);
- 节点4*k+2代表左下子矩阵(以(lx, my +1)为左上角、(mx, ry)为右下角);
- 节点4*k+3代表右下子矩阵(以(mx +1, my +1)为左上角、(rx, ry) 为右下角)。
若节点k为像素(lx == rx && ly == ry),则节点k作为叶节点,根据像素颜色确定叶节点k的值:
- 若(lx, ly)为白像素,则节点k的值为2;
- 若(lx, ly)为黑像素,则节点k的值为1,即节点k的值为1<<g[lx][ ly]。
- 否则k为分支节点,递归计算4个孩子的值。而节点k的值为4个孩子或等的结果。
显然,或等结果为3,表明k节点对应的子矩阵既有白色像素又有黑色像素;或等结果为1,表明k节点对应的子矩阵全为黑像素;或等结果为2,表明对应的子矩阵全为白像素。
3.计算四叉树的先序串
从节点u出发,按照下述方法计算和输出以u为根的四叉树的先序串:
- 若节点u的值为1,则输出对应子矩阵全黑标志‘0’;
- 若节点u的值为2,则输出对应子矩阵全白标志‘1’;
- 若节点u的值为3,则表明节点u对应的子矩阵既有白色像素又有黑色像素。
- 若u非根(u≠1),则输出节点u对应的子矩阵灰色标志’*’
(注意:若整个矩阵黑白相间,则略去出根节点的灰色标志)。依次递归u的四个孩子,计算和输出对应子区间的颜色标志。