在一个奇幻世界中,有一个矩形的大岛。岛的边长分别为 $R$ 英里 and $C$ 英里,整个岛屿被划分为 $R \times C$ 的网格区域。部分区域无人居住,其余区域则由奇幻生物的村庄占据:精灵(elves)、人类(humans)、矮人(dwarves)和霍比特人(hobbits)。每个区域最多包含一个村庄。如果两个村庄所在的区域共享一条边,则称它们为邻居。
最近,村庄里的人们对“大邪恶”(Great Evil)感到非常恐惧。为了感到更安全,每个村庄都决定与它的一些邻居建立军事联盟。联盟总是涉及两个相邻的村庄,这是一种双向且对称的协议。
根据村庄中居住的物种,除非形成特定的联盟配置,否则居民将不会感到安全:
- 精灵感到很自信,因此只需要恰好一个联盟。
- 人类村庄需要与恰好两个邻居结盟。此外,出于战术原因,让村庄的两个相反方向暴露在外是不好的。因此,结盟的两个邻居不能位于村庄的相反两侧(即不能是相对的两个方向,必须呈 L 形)。
- 矮人需要与恰好三个邻居结盟。
- 霍比特人非常胆小,因此需要与他们的全部四个邻居结盟。
换句话说,除了人类之外,每个村庄都只需要特定数量的联盟,而不在乎哪些邻居是其盟友。对于人类,还有一个额外的限制:结盟的邻居不能在村庄的相反两侧。
无论村庄在地图上的位置如何,这些条件都必须满足。例如,一个矮人村庄渴望三个联盟。如果它位于海岸边,这意味着它必须与所有三个邻居结盟。如果岛屿的角落里有一个矮人村庄,那么它的居民将永远无法感到安全。
任务描述
给定岛屿的描述,你的任务是判断是否可能建立联盟,使得岛上的所有居民都感到安全。如果答案是肯定的,你还需要给出一种可行的联盟配置。如果存在多种解决方案,输出任意一种即可。
输入格式
输入的第一行包含两个整数 $R$ 和 $C$,表示岛屿的大小。
接下来的 $R$ 行编码了岛屿的描述。每行包含 $C$ 个由空格分隔的介于 $0$ 到 $4$ 之间的整数:
0表示无人居住的区域,1表示精灵村庄,2表示人类村庄,3表示矮人村庄,4表示霍比特人村庄。
(注意,输入中的数字始终对应于该村庄所期望的联盟数量。)
数据范围
对于所有测试数据,满足 $1 \le R, C \le 70$。
在占总分 55 分的测试数据中,满足 $\min(R, C) \le 10$。其中,在占总分 15 分的测试数据中,满足 $R \cdot C \le 20$。
另一组占总分 10 分的测试数据中,地图仅包含无人居住的区域和人类村庄。(这组测试数据不包含在上述 55 分的测试数据中。)
输出格式
如果无解,输出单行字符串 Impossible!(不含引号)。
否则,按照以下格式输出一张可行的联盟地图。
输出中的每个区域应表示为一个 $3 \times 3$ 的字符矩阵。如果该区域无人居住,则输出的对应部分应全部填充为 .(点)字符。如果该区域有村庄,则中心位置(第 2 行第 2 列)应为字符 O(大写字母 O)表示村庄本身,并且在与盟友相邻的方向上应使用字符 X(大写字母 X)表示联盟。该 $3 \times 3$ 矩阵的其余部分应填充为 .(点)字符。
对于每种村庄类型,所有可能的联盟布局如下图所示:
样例
输入格式 1
3 4 2 3 2 0 3 4 3 0 2 3 3 1
输出格式 1
............ .OXXOXXO.... .X..X..X.... .X..X..X.... .OXXOXXO.... .X..X..X.... .X..X..X.... .OXXOXXOXXO. ............
输入格式 2
1 2 2 1
输出格式 2
Impossible!