QOJ.ac

QOJ

Time Limit: 1 s Memory Limit: 128 MB Total points: 100

#15252. 联盟

Statistics

在一个奇幻世界中,有一个矩形的大岛。岛的边长分别为 $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!

Discussions

About Discussions

The discussion section is only for posting: General Discussions (problem-solving strategies, alternative approaches), and Off-topic conversations.

This is NOT for reporting issues! If you want to report bugs or errors, please use the Issues section below.

Open Discussions 0
No discussions in this category.

Issues

About Issues

If you find any issues with the problem (statement, scoring, time/memory limits, test cases, etc.), you may submit an issue here. A problem moderator will review your issue.

Guidelines:

  1. This is not a place to publish discussions, editorials, or requests to debug your code. Issues are only visible to you and problem moderators.
  2. Do not submit duplicated issues.
  3. Issues must be filed in English or Chinese only.
Active Issues 0
No issues in this category.
Closed/Resolved Issues 0
No issues in this category.