SP3249 TYPESET - Typesettin

题目描述

现代字体通常分为两种:轮廓字体和点阵字体。轮廓字体通过数学曲线定义字形(即各个字符的形状),而点阵字体则通过像素图案定义字形。此外,字体可能还包括一些嵌入的信息,例如字距调整对(用于调整某些字符对之间的间距,如“AW”组合的间距)以及字距提示(用于管理字符之间的空隙),抗锯齿提示(用于平滑像素边缘)等。这表明,现代字体不仅仅是一系列简单的形状,正确显示它们是程序员需要解决的一个常见问题。 在本题中,我们关注点阵字体以及一种被称作字形紧缩的简单排版方法。该方法的基本思路是尽可能紧密地排列字形,同时确保字形之间至少有一个像素的水平间距。例如,参考下图左侧的字母“P”和“J”的字形,右侧则是它们经过字形紧缩后的布局。可以看到,在紧缩后,它们在横向上尽可能接近但没有接触。 ![PJ](http://mcpc.cigas.net/archives/2007/mcpc2007/typesetting/PJ.png) 再看另一个例子,最后一个字形在这种情况下无法进行紧缩。 ![Fiji](http://mcpc.cigas.net/archives/2007/mcpc2007/typesetting/Fiji.png) 在字形紧缩后,不同字形的像素点可以斜向或垂直相邻,但不能水平相邻。下例展示了像素的斜向相邻,“Love”测试用例证明了像素可以垂直相邻。 ![两个斜杠](http://mcpc.cigas.net/archives/2007/mcpc2007/typesetting/Slashes.png) 字形紧缩的一个非常好的特性是,可以轻松地将“特殊”效果植入字体中,通过字形紧缩就能产生独特效果。看看“Toy”例子,这种简单的紧缩方式让结果更具表现力。 ![Toy](http://mcpc.cigas.net/archives/2007/mcpc2007/typesetting/Toy.png) 然而,字形紧缩也有一些需要注意的事项,其中一个我们在这个问题中必须考虑。请思考下面左侧的例子,当连字符和下划线的字形紧邻时,按我们的水平间隔规则,该如何进行紧缩?显然,还需要更多规则来解决,比如在字形中嵌入提示信息。在实际应用中,字体包含字距调整对、字距提示等。对于我们而言,“不可见”像素的提示信息也被算作像素,却不显示出来。中间图像用空心圆点表示这些不可见像素。现在,这两个字形可以被正确紧缩,结果如右图所示。 ![隐藏像素](http://mcpc.cigas.net/archives/2007/mcpc2007/typesetting/HU.png) 现在来具体定义一下正确的字形紧缩:(1)字形应在不让不同字形的像素水平相邻的情况下尽可能紧密地排列;(2)对于左侧和右侧相邻的两个字形,它们不能排列成左侧字形中某一高度上的像素位于右侧字形中相同高度的像素右侧的情况。 条件 (2) 可以形象地理解为,当两个字形并排放置并按条件之间有小间距时,它们的像素不能“穿过”对方。请看下图左侧的例子,中间的图不符合正确的紧缩,因为它违反了条件 (2),而右图展示了正确的紧缩。 ![hooks](http://mcpc.cigas.net/archives/2007/mcpc2007/typesetting/Hooks.png)

输入格式

输入由待紧缩的字形集构成。在每个测试用例中,所有字形的高度相同,测试用例的第一行包含一个整数 $N$,表示高度。接下来的 $N$ 行中包含要紧缩的字形。字形中的空白像素用点号 `.` 表示;可见的像素用井号 `#`,而不可见的像素用数字 `0` 表示。字形之间由一个列的空格分隔。输入至少包含两个字形,其中至少一个字形有至少一个可见像素。每个字形的最左和最右一列至少有一个非空像素,并且至少与输入中的其他字形在相同高度上有一个非空像素。字形的最小尺寸为 1x1,最大为 20x20,每个测试用例最多包含 20 个字形。当 $N$ 为 0 时,表示输入结束。

输出格式

对于每个测试用例,先单独一行输出该测试用例的编号(从 1 开始)。然后输出经过正确紧缩后的字形,使用点号 `.` 表示空白和不可见像素,井号 `#` 表示可见像素。省略前后的空白列(没有可见像素的列),使得输出的最左和最右列至少有一个可见像素。 **本翻译由 AI 自动生成**