SP903 DOUBLEVI - Double Vision
题目描述
DoubleVision 公司研发了一种字体,这种字体不仅适合人眼阅读,还可以被机器轻松识别。他们在一个矩形网格上设计这些字体。下面是一个简单的 5x3 的设计,代表了前五个数字:
```
. o . . o . o o . o o . o . o
o . o . o . . . o . . o o . o
o . o . o . . o . o o . o o o
o . o . o . o . . . o . . o .
. o . . o . o o . o o . . . o
```
这种墨水看起来是普通的黑色墨水,但在其下 DoubleVision 添加了一种特殊聚合物,这种聚合物能够被红外扫描仪检测到。人眼能看到黑色墨水,但看不到聚合物,而机器则相反。问题是,该聚合物比墨水要昂贵不少,所以 DoubleVision 希望尽量少用。经过研究,他们发现,对很多字体来说,每个符号都可以通过一或两个像素来唯一识别。通过在每个符号上仅添加一到两个聚合物像素,他们可以极大降低成本,同时确保扫描识别的准确性。展示的字体就具备这种属性,而可以唯一识别每个字母的像素用 `#` 标记。(当然,还有其他选法也能达到同样效果。)
```
. # . . o . # o . o o . o . #
# . o . # . . . o . . o o . o
o . o . o . . o . # o . o o o
o . o . o. # . . . o . . o .
. o . . o . o o . # o . . . o
```
你的任务是编写一个程序,判断给定的字体是否具有这种唯一识别的属性,如果有,则标记出这些像素。
输入包含一个或多个测试用例,以一行 `0 0 0` 作为结束标志。每个测试用例由一行开始,包含三个正整数 $n$、$r$ 和 $c$,表示字体的符号数量、网格的行数和列数。接下来的 $r$ 行是各个符号的图像,格式与示例一致:`.` 表示网格的空白部分,小写字母 `o` 表示一个像素,相邻网格用空格分隔。每行总宽度不超过 79 个字符(不包括换行符),并且 $r$ 的最大值为 10。测试用例按顺序编号,从 1 开始。
对于每个测试用例 $i$,首先输出一行 `Test i`。然后判断每个符号是否能用一或两个像素唯一识别。如果不能,输出 `impossible`。否则,在相同格式下输出字体,只是将识别像素替换为 `#`。
可能存在多个不同的像素或像素对能够唯一识别一个符号。为了输出的唯一性,我们定义并遵循以下规则:当比较两个像素时,"最上-最左"像素是指在网格上方且最靠左的那个。如果两个像素位于同一行,那么最靠左的像素为"最上-最左"。如果一个像素足够,就标记最上-最左像素。如果能够使用一个像素的解法,不要选择两个像素的解决方案。如果需要两个像素,则标记包含最上-最左像素的那对。若有多对具有相同的最上-最左像素,标记按"最上-最左"的其他像素。
输入格式
输入由以下部分构成:
1. 各测试用例每一行由三个正整数 $n$、$r$ 和 $c$ 构成,表示符号数量、网格行数和列数。
2. 接下来的 $r$ 行,每行代表一个符号的图像。
3. 以 `0 0 0` 行结束。
输出格式
对于每个测试用例,输出:
1. 一行文本 `Test i`,$i$ 表示测试用例编号。
2. 若不能用一或两个像素识别符号,输出 `impossible`。
3. 否则,输出标记后包含 `#` 的网格图像。
说明/提示
- $1 \le n, r, c \le 10$
- 每行总宽度最多 79 个字符(不包括换行符)
- 测试用例以 `0 0 0` 结束
**本翻译由 AI 自动生成**