#P1888. Crossword Answers

Crossword Answers

描述

填字游戏由一个黑白方格组成的矩形网格和两个定义(或描述)列表组成。

一个定义列表是用于从左到右横向填入白色方格的"单词",另一个列表是用于从上到下纵向填入白色方格的单词。(单词是字母字符的序列。)

为了解决填字游戏,需要将与定义相对应的单词写在网格的白色方格上。

定义通过"合格"白色方格上的连续整数与矩形网格对应。左侧或上方紧邻黑色方格的白色方格是"合格"的。左侧或上方没有方格的白色方格也是"合格"的。其他方格不编号。第一行的所有方格都编号。

编号从1开始,连续地跨越第一行的白色方格,然后跨越第二行的合格白色方格,接着跨越第三行的合格白色方格,依此类推,跨越谜题的所有其余行。下图说明了一个带有适当编号的矩形填字游戏网格。

一个定义的"横向"单词写在一行的白色方格序列上,从一个编号的方格开始,该方格不跟随同一行中的另一个白色方格。该单词的白色方格序列跨越编号方格所在的行,在该行中下一个黑色方格之前或该行最右侧的方格处结束。

一个定义的"纵向"单词写在一列的白色方格序列上,从一个编号的方格开始,该方格不跟随同一列中的另一个白色方格。该单词的白色方格序列向下跨越编号方格所在的列,在该列中下一个黑色方格之前或该列最底部的方格处结束。每个正确解决的谜题中的白色方格都包含一个字母。

你必须编写一个程序,将几个已解决的填字游戏作为输入,并输出构成解决方案的横向和纵向单词列表。

输入

输入中的每个谜题解决方案都以包含两个整数rrcc1r101 \leq r \leq 101c101 \leq c \leq 10)的行开始,其中rr(第一个数字)是谜题中的行数,cc(第二个数字)是列数。接下来的rr行输入每行包含cc个字符(不包括行尾),描述解决方案。这些cc个字符中的每一个都是单词的一部分的字母字符,或者是字符"*",表示黑色方格。输入的结束由仅包含数字0的行指示。

输出

每个谜题的输出包括谜题的标识符(puzzle #1、puzzle #2等)以及横向单词列表,后跟纵向单词列表。每个列表中的单词必须按其对应定义的编号递增顺序每行输出一个。横向单词列表的标题是"Across"。纵向单词列表的标题是"Down"。在列表为空的情况下(网格中的所有方格都是黑色的),Across和Down标题仍应出现。

输入数据 1

2 2
AT
*O
6 7
AIM*DEN
*ME*ONE
UPON*TO
SO*ERIN
*SA*OR*
IES*DEA
0

输出数据 1

puzzle #1:
Across
  1.AT
  3.O
Down
  1.A
  2.TO

puzzle #2:
Across
  1.AIM
  4.DEN
  7.ME
  8.ONE
  9.UPON
 11.TO
 12.SO
 13.ERIN
 15.SA
 17.OR
 18.IES
 19.DEA
Down
  1.A
  2.IMPOSE
  3.MEO
  4.DO
  5.ENTIRE
  6.NEON
  9.US
 10.NE
 14.ROD
 16.AS
 18.I
 20.A