#P14800. [Bulgarian2018组队赛]frame
[Bulgarian2018组队赛]frame
题目描述
几天后,Deni 要去参加她最好朋友的生日会。想了很久之后,她决定送一张两人的合照,但家里没有合适的相框。于是她去商店看正方形相框(由于某种奇怪的原因,这张照片是正方形的)。
她一把拿起了好几个相框,然后——正如你所料——全都掉到了地上。巧合的是,所有相框掉下时,它们的边都与商店地板边界平行(商店地板是一个矩形)。而且,由于 Deni 绝望地试图抢救这些相框,它们是一只接一只掉下去的:先掉第一个,再掉第二个,依此类推,直到全部落地。
这样便形成了一幅有趣的图案:
- 有的相框叠在别的相框上面;
- 有的彼此相交;
- 有的互相接触;
- 有的一个套在另一个里面但没有公共点;
- 有的彼此分离;
- ……
总之,什么情况都可能发生。
Deni 想知道:地板上到底有哪些相框,它们又是按什么顺序掉下来的,才会形成这样一幅图案。
请编写程序 frames,构造一组正方形相框及其在地板上的位置与掉落顺序,使得最终得到的图案与输入完全一致。
程序首先读入商店地板的大小 N × M(像素),然后逐像素给出最终图案。字符含义如下:
'.':空像素;'-':相框的水平边;'|':相框的竖直边;'1':左上角;'2':右上角;'3':右下角;'4':左下角。
注意:如果某个像素位置被多个相框覆盖,则输入中给出的是最上层那个相框的符号。
保证输入图案一定由某个合法的相框落下顺序产生。
你需要输出任意一个可行解,即:
- 相框总数;
- 每个相框左上角和右下角坐标;
- 相框按掉落顺序输出:最早掉下的先输出,然后是第二个,依此类推。
地板左上角坐标为 (0, 0),右下角坐标为 (N-1, M-1)。
输入格式
第一行输入两个正整数 N 和 M,表示地板大小(像素)。
接下来 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.