Creating a Quadtree(四叉树)

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的四个孩子,计算和输出对应子区间的颜色标志。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值