#P14800. [Bulgarian2018组队赛]frame

    ID: 14016 传统题 1000ms 256MiB 尝试: 3 已通过: 1 难度: 7 上传者: 标签>CF2300构造贪心枚举模拟搜索拓扑排序

[Bulgarian2018组队赛]frame

题目描述

几天后,Deni 要去参加她最好朋友的生日会。想了很久之后,她决定送一张两人的合照,但家里没有合适的相框。于是她去商店看正方形相框(由于某种奇怪的原因,这张照片是正方形的)。

她一把拿起了好几个相框,然后——正如你所料——全都掉到了地上。巧合的是,所有相框掉下时,它们的边都与商店地板边界平行(商店地板是一个矩形)。而且,由于 Deni 绝望地试图抢救这些相框,它们是一只接一只掉下去的:先掉第一个,再掉第二个,依此类推,直到全部落地。

这样便形成了一幅有趣的图案:

  • 有的相框叠在别的相框上面;
  • 有的彼此相交;
  • 有的互相接触;
  • 有的一个套在另一个里面但没有公共点;
  • 有的彼此分离;
  • ……

总之,什么情况都可能发生。

Deni 想知道:地板上到底有哪些相框,它们又是按什么顺序掉下来的,才会形成这样一幅图案。

请编写程序 frames,构造一组正方形相框及其在地板上的位置与掉落顺序,使得最终得到的图案与输入完全一致。

程序首先读入商店地板的大小 N × M(像素),然后逐像素给出最终图案。字符含义如下:

  • '.':空像素;
  • '-':相框的水平边;
  • '|':相框的竖直边;
  • '1':左上角;
  • '2':右上角;
  • '3':右下角;
  • '4':左下角。

注意:如果某个像素位置被多个相框覆盖,则输入中给出的是最上层那个相框的符号。

保证输入图案一定由某个合法的相框落下顺序产生。

你需要输出任意一个可行解,即:

  1. 相框总数;
  2. 每个相框左上角和右下角坐标;
  3. 相框按掉落顺序输出:最早掉下的先输出,然后是第二个,依此类推。

地板左上角坐标为 (0, 0),右下角坐标为 (N-1, M-1)

输入格式

第一行输入两个正整数 NM,表示地板大小(像素)。

接下来 N 行,每行输入一个长度为 M 的字符串,只包含题目中说明的那些字符。

输出格式

第一行输出一个整数 K,表示你构造出的相框数量。

接下来 K 行,每行输出四个整数,分别表示一个相框左上角与右下角的坐标。

这些相框必须按掉落顺序排列。

注意事项

  • 相框数量必须不超过 600
  • 题目保证所有测试都存在一个最多 600 个相框的解。

限制

  • 3 ≤ N, M ≤ 100
  • 每个相框的边长至少为 2 个像素

评分方式

  • 测试按组计分,一组中的所有测试全部通过才能得到该组分数;
  • 50% 的测试组中,N, M ≤ 50
  • 在其余 50% 的测试组中,没有额外限制。

样例一输入

5 5
1--2.
|.1-2
|.|||
4-4-3
.....

样例一输出

2
0 0 3 3
1 2 3 4

样例一说明

原题说明:这只是一个可行输出。另一个可行输出例如:

3
0 0 2 2
1 2 2 3
1 2 3 4

样例二输入

10 10
..1-1----2
1-------2|
1----2--||
||||||..||
||||||..||
|-|-4|--|3
||||||--||
4----3--||
||4-----|3
4-------3.

样例二输出

15
1 2 8 9
2 1 9 8
1 1 5 5
5 0 9 4
2 3 7 8
5 2 7 4
6 5 9 8
5 4 9 8
0 2 2 4
0 4 5 9
1 4 5 8
5 5 8 8
2 2 8 8
1 0 9 8
2 0 7 5

样例二说明

原题说明:这也是一个可行解。按该输出的前 3 个相框依次放下后,地板会变成:

..........
.1---2---2
.|---|--2|
.||..|..||
.||..|..||
.4---3..||
.||.....||
.||.....||
.|4-----|3
.4------3.