#P1623. Squadtrees

Squadtrees

题目描述

四叉树是用于存储数字图像的数据结构。在本题中,图像为简单位图,每个像素为1(黑色)或0(白色)。位图的四叉树表示方法如下:

  1. 根节点对应整个图像。若整幅图像全为1或全为0,则在节点中存储该值,结束处理。
  2. 否则将图像分为四个等大的象限,按顺序为根节点添加四个子节点:左上、右上、左下、右下。
  3. 对每个子节点递归应用上述规则。

例如,左侧4×4图像对应右侧的四叉树表示:

注意:仅当图像为正方形且边长为2的幂时,上述流程直接适用。若图像不满足条件,需向右和向下填充0,直至边长为2的幂。例如,5×13的图像会被补成16×16,原图像位于左上角,其余区域填0。

四叉树相比原图可显著节省空间,若识别重复子树则能进一步压缩。例如,若根节点的第一和第三子树相同,可将第三子树的根替换为对第一子树的引用,形成“超级四叉树”(squadtree)

本题任务:对给定图像,计算四叉树和超级四叉树的节点数。

输入格式

  • 多组测试用例,每组首行含整数n和m(图像行列数,n,m≤128)。
  • 接下来n行,每行m个字符('1'表示黑像素,'0'表示白像素)。
  • 输入0 0时结束,无需处理。

输出格式

对每组测试用例,输出两个整数,分别为四叉树节点数和超级四叉树节点数,以空格分隔。

输入样例

4 4  
1011  
0111  
1010  
0111  
6 7  
1110111  
1010101  
0000000  
0100010  
1011101  
1010101  
0 0  

输出样例

17 12  
61 24  

题目来源

北美中东部编程竞赛(East Central North America)2003