#P1086. Unscrambling Images

    ID: 87 传统题 1000ms 256MiB 尝试: 1 已通过: 1 难度: 10 上传者: 标签>数据结构四分树East Central North America 1999

Unscrambling Images

描述
四叉树通常用于以紧凑的形式对数字图像进行编码。给定一个 n×nn \times n 的图像(其中 nn 是 2 的幂,1n161 \leq n \leq 16),其四叉树编码的计算方法如下。从只有一个节点的四叉树开始,即根节点,并将整个图像的 n×nn \times n 方形区域与该节点关联。然后按照以下步骤递归进行:

  1. 如果当前节点关联的区域中的每个像素的强度值均为 pp,则该节点成为叶子节点,并被分配一个关联值 pp

  2. 否则,向当前节点添加四个子节点。将区域划分为四个相等的(方形)象限,并将每个象限分配给一个子节点。算法对每个子节点递归执行。

当该过程终止时,我们得到一个四叉树,其中每个内部节点都有四个子节点。每个叶子节点都有一个关联值,表示与叶子节点对应的区域的强度。下面展示了一个图像及其四叉树编码的示例。

我们假设四个子节点从左到右分别代表左上、右上、左下和右下象限。

为了便于在四叉树中识别一个节点,我们按照以下规则为每个节点分配编号:

  1. 根节点编号为 0。

  2. 如果一个节点的编号为 kk,则其子节点从左到右的编号分别为 4k+14k+14k+24k+24k+34k+34k+44k+4

通过秘密密码对以四叉树编码的图像进行加密的方法如下:每次进行划分时,四个分支会被重新排序。每个节点的重新排序方式可能不同,但完全由密码和节点编号决定。

不幸的是,有些人使用编码程序中的“保存密码”功能,并对多幅图像使用相同的密码。通过观察一个精心选择的测试图像的编码,可以解码任何使用相同密码编码的图像,而无需密码。在这个测试图像中,每个像素的强度值从 0 到 n21n^2 - 1,按从左到右、从上到下的顺序递增排列。下面给出了 n=16n = 16 的示例:

你设法获得了编码程序的访问权限,并使用它对测试图像进行了编码。给定测试图像的四叉树编码,编写一个程序来解码任何其他使用相同密码编码的图像。

输入
输入中包含多个测试用例。输入的第一行是一个正整数,表示要处理的测试用例数量。每个测试用例以一行包含 nn 的行开始,随后是测试图像的四叉树编码和需要解码的秘密图像的四叉树编码。每个四叉树编码以一行包含一个正整数 mm 开始,表示树中叶子节点的数量。接下来的 mm 行格式为:

kk 强度

这指定了编号为 kk 的节点是叶子节点,并且具有指定的强度作为关联的叶子值。未指定的节点要么是内部节点,要么在四叉树中不存在。你可以假设所有强度值在 0 到 255 之间(包括 0 和 255)。你也可以假设每个四叉树编码都是上述编码算法的有效输出。

输出
对于每个测试用例,首先打印用例编号,然后打印一个空行。然后,按行打印解码图像的像素强度值。每个强度值在宽度为 4 的字段中右对齐,字段之间没有多余空格。在用例之间插入一个空行。

输入数据 1

2  
2  
4  
1 3  
2 2  
3 0  
4 1  
4  
1 23  
2 123  
3 253  
4 40  
4  
16  
5 8  
6 9  
7 13  
8 12  
9 0  
10 4  
11 1  
12 5  
13 2  
14 3  
15 7  
16 6  
17 10  
18 11  
19 15  
20 14  
7  
2 10  
3 20  
4 30  
5 41  
6 42  
7 44  
8 43  

输出数据 1

Case 1  

 253  40  
 123  23  

Case 2  

  10  10  20  20  
  10  10  20  20  
  41  42  30  30  
  43  44  30  30

来源
东中北美 1999