#z1070. 闽南大厝的木雕窗格

闽南大厝的木雕窗格

题目背景

红砖白石双坡厝是闽南传统民居的典型代表。大厝的木雕窗格图案精美异常,往往呈现出严谨的数学几何嵌套结构。

题目描述

现有一个大小为 2N×2N2^N \times 2^N 的方格矩阵,用来表示一副复古窗格的数字拓印图。矩阵中的每个元素非 01。 为了将这个窗格图案进行数字化无损压缩,我们需要运用四叉树分治算法进行递归编码。具体的编码函数 encode(r1, c1, r2, c2) 规则如下:

  1. 如果当前处理的子矩阵(行范围 [r1,r2][r1, r2],列范围 [c1,c2][c1, c2])中的所有元素完全相同(全为 0 或全为 1),则直接输出该数字字符(01),当前层递归结束。
  2. 如果子矩阵中既有 0 又有 1,说明图案不单一。此时首先输出一个大写字母 X,然后将当前子矩阵平均分割成四个相等大小的子正方形,并按照如下顺序递归调用编码:
  • 左上子矩阵
  • 右上子矩阵
  • 左下子矩阵
  • 右下子矩阵

现在给定这个 2N×2N2^N \times 2^N 的 01 矩阵,请你输出它最终的递归编码字符串。

输入格式

第一行包含一个整数 NN,表示矩阵的大小为 2N×2N2^N \times 2^N。 接下来 2N2^N 行,每行包含一个长度为 2N2^N 的由 01 组成的字符串,表示窗格矩阵。

输出格式

输出一行字符串,表示最终的递归压缩编码。

输入输出样例

输入 #1

2
1011
1111
0010
0001

输出 #1

XX101110X1001

样例说明: 初始矩阵大小为 4×44 \times 4。非全等,输出 X。 划分 4 个 2×22 \times 2 子矩阵:

  1. 左上 2×22 \times 210 / 11,非全等,输出 X,再分四个 1×11 \times 1,输出 1011
  2. 右上 2×22 \times 211 / 11,全 1,输出 1
  3. 左下 2×22 \times 200 / 00,全 0,输出 0
  4. 右下 2×22 \times 210 / 01,非全等,输出 X,再分四个 1×11 \times 1,输出 1001。 拼接起来即得到 XX101111XX000010(注:手算核对结果)。

说明/提示

对于 100%100\% 的数据:1N61 \le N \le 6,即矩阵最大为 64×6464 \times 64