#P1086. Unscrambling Images
Unscrambling Images
描述
四叉树通常用于以紧凑的形式对数字图像进行编码。给定一个 的图像(其中 是 2 的幂,),其四叉树编码的计算方法如下。从只有一个节点的四叉树开始,即根节点,并将整个图像的 方形区域与该节点关联。然后按照以下步骤递归进行:
-
如果当前节点关联的区域中的每个像素的强度值均为 ,则该节点成为叶子节点,并被分配一个关联值 。
-
否则,向当前节点添加四个子节点。将区域划分为四个相等的(方形)象限,并将每个象限分配给一个子节点。算法对每个子节点递归执行。
当该过程终止时,我们得到一个四叉树,其中每个内部节点都有四个子节点。每个叶子节点都有一个关联值,表示与叶子节点对应的区域的强度。下面展示了一个图像及其四叉树编码的示例。
我们假设四个子节点从左到右分别代表左上、右上、左下和右下象限。
为了便于在四叉树中识别一个节点,我们按照以下规则为每个节点分配编号:
-
根节点编号为 0。
-
如果一个节点的编号为 ,则其子节点从左到右的编号分别为 、、 和 。
通过秘密密码对以四叉树编码的图像进行加密的方法如下:每次进行划分时,四个分支会被重新排序。每个节点的重新排序方式可能不同,但完全由密码和节点编号决定。
不幸的是,有些人使用编码程序中的“保存密码”功能,并对多幅图像使用相同的密码。通过观察一个精心选择的测试图像的编码,可以解码任何使用相同密码编码的图像,而无需密码。在这个测试图像中,每个像素的强度值从 0 到 ,按从左到右、从上到下的顺序递增排列。下面给出了 的示例:
你设法获得了编码程序的访问权限,并使用它对测试图像进行了编码。给定测试图像的四叉树编码,编写一个程序来解码任何其他使用相同密码编码的图像。
输入
输入中包含多个测试用例。输入的第一行是一个正整数,表示要处理的测试用例数量。每个测试用例以一行包含 的行开始,随后是测试图像的四叉树编码和需要解码的秘密图像的四叉树编码。每个四叉树编码以一行包含一个正整数 开始,表示树中叶子节点的数量。接下来的 行格式为:
强度
这指定了编号为 的节点是叶子节点,并且具有指定的强度作为关联的叶子值。未指定的节点要么是内部节点,要么在四叉树中不存在。你可以假设所有强度值在 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