#P1623. Squadtrees
Squadtrees
题目描述
四叉树是用于存储数字图像的数据结构。在本题中,图像为简单位图,每个像素为1(黑色)或0(白色)。位图的四叉树表示方法如下:
- 根节点对应整个图像。若整幅图像全为1或全为0,则在节点中存储该值,结束处理。
- 否则将图像分为四个等大的象限,按顺序为根节点添加四个子节点:左上、右上、左下、右下。
- 对每个子节点递归应用上述规则。
例如,左侧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