#4397. USACO 2014 December Contest, Bronze Crosswords

USACO 2014 December Contest, Bronze Crosswords

题目描述

像所有奶牛一样,贝西喜欢解填字游戏。不幸的是,她的姐姐埃尔西把牛奶洒在了她的填字游戏书上,弄脏了文字,让她很难看清每个线索的起始位置。你的任务是帮助贝西恢复线索编号!

一个未标记的填字游戏以一个NNMM列的网格(3 <= NN <= 50,3 <= MM <= 50)的形式给出。一些单元格是清晰的(通常为白色),一些单元格是阻塞的(通常为黑色)。根据这个布局,线索编号是一个简单的过程,遵循两个逻辑步骤:

步骤1:我们确定每个单元格是否开始一个水平或垂直线索。如果一个单元格开始一个水平线索,它必须是清晰的,其左边的相邻单元格必须是阻塞的或在填字游戏网格之外,并且其右边的两个单元格必须是清晰的(也就是说,水平线索只能代表一个3个或更多字符的单词)。开始垂直线索的单元格的规则类似:上方的单元格必须是阻塞的或在网格之外,并且下方的两个单元格必须是清晰的。

步骤2:我们为每个开始线索的单元格分配一个数字。单元格从1开始按顺序编号,编号顺序与你读书的顺序相同;第一行的单元格从左到右编号,然后是第二行,依此类推。只有开始线索的单元格才会被分配数字。

例如,考虑下面的网格,其中'.'表示清晰的单元格,'#'表示阻塞的单元格:

...
#..
...
..#
.##

可以开始水平或垂直线索的单元格在下面用'!'标记:

!!!
#..
!..
..#
.##

如果我们为这些单元格分配数字,我们得到:

123
#..
4..
..#
.##

请注意,输入数据中描述的填字游戏可能不满足通常在已出版的填字游戏中看到的约束。例如,一些清晰的单元格可能不属于任何线索。

输入格式

  • 第1行:输入包含用空格分隔的NNMM
  • 接下来NN行:每行描述网格的一行。每行包含MM个字符,要么是'.'(清晰的单元格)要么是'#'(阻塞的单元格)。

输出格式

  • 第1行:输出线索的数量。
  • 在其余的每行中,输出单个线索的位置(按上述描述的顺序)。左上角的单元格位置为(1,1)(1, 1)。右下角的单元格位置为(N,M)(N, M)

样例

样例输入

5 3
...
#..
...
..#
.##

样例输出

4
1 1
1 2
1 3
3 1

数据范围

3 <= NN <= 50,3 <= MM <= 50