#P1110. Double Vision
Double Vision
描述
DoubleVision公司设计的墨水和字体,既能让人类轻松阅读,也能被机器轻松识别。他们在一个矩形网格上设计字体。下面展示的是一个非常简单的用于表示前五个数字的设计。
.o. .o. oo. oo. o.o
o.o .o. ..o ..o o.o
o.o .o. .o. oo. ooo
o.o .o. o.. ..o ..o
.o. .o. ooo oo. ..o
这种墨水看起来是普通的黑色墨水,但在墨水表面之下,DoubleVision公司添加了一种特殊的聚合物,这种聚合物可以被红外扫描仪检测到。人类只能看到黑色墨水,而看不到聚合物,而机器能检测到聚合物,却看不到黑色墨水。唯一的问题是,这种聚合物比墨水昂贵得多,所以DoubleVision公司希望尽可能少地使用它。他们发现,对于许多字体来说,每个符号最多可以通过两个像素来唯一识别。通过仅在每个符号的一个或两个像素上添加这种聚合物,他们在大幅降低成本的同时,仍能确保扫描仪识别的准确率达到。上面展示的字体就具有这个特性;每个字符的唯一识别像素用“#”突出显示。(也有其他可行的选择。)
.#. .o. #o. oo. o.#
#.o .#. ..o ..o o.o
o.o .o. .o. #o. ooo
o.o .o. #.. ..o ..o
.o. .o. ooo #o. ..o
你的任务是编写一个程序,判断给定的字体是否具有此属性,如果是,则突出显示这些像素。
输入
输入由一个或多个测试用例组成,后面跟着一行包含“0 0 0”(三个零)的内容,这表示输入的结束。每个测试用例以包含三个正整数、和的一行开始,它们之间用空格分隔:是字体中符号的数量,是每个网格的行数,是每个网格的列数。接下来的行包含每个符号的图像,使用的格式与示例中完全相同:点“.”表示网格的空白部分,小写字母“o”表示一个像素,相邻的网格之间用空格分隔。每行的总宽度(不包括行尾字符)最多为个字符,并且最多为。测试用例隐式地从开始编号。
输出
对于第个测试用例,首先输出一行“Test ”。然后判断每个符号是否可以用一个或两个像素唯一识别。如果不能,则输出一行“impossible”。否则,以相同的格式输出字体,但每个符号的识别像素用“#”替换。
一般来说,可能有几种不同的单个像素或像素对可以唯一识别一个符号。为了确保输出的唯一性,我们添加以下定义和规则。在比较两个像素时,最上方且最左侧的像素是最接近网格顶部的像素。如果两个像素在同一行,那么最上方且最左侧的像素是最接近网格左侧的那个像素。
如果一个像素就可以完成识别,突出显示最上方且最左侧的那个可行的像素。如果存在一个像素就能识别的情况,就绝不要使用两个像素的解决方案。如果需要两个像素来识别,突出显示包含最上方且最左侧像素的那对像素。如果有两个或更多对像素具有相同的最上方且最左侧像素,则突出显示另一像素也是最上方且最左侧的那一对像素。
输入示例
3 2 2
oo oo .o
o. .o o.
3 2 2
oo oo .o
o. .o oo
5 5 3
.o. .o. oo. oo. o.o
o.o .o. ..o ..o o.o
o.o .o. .o. oo. ooo
o.o .o. o.. ..o ..o
.o. .o. ooo oo. ..o
1 2 4
.o..
...o
0 0 0
输出示例
Test 1
impossible
Test 2
#o #o .o
#. .# ##
Test 3
.#. .o. #o. oo. o.#
#.o .#. ..o ..o o.o
o.o .o. .o. #o. ooo
o.o .o. #.. ..o ..o
.o. .o. ooo #o. ..o
Test 4
.#..
...o
来源
2001年美国中北部地区竞赛