Luogu-P2407-地图复原
题目 P2407 [SDOI2009] 地图复原
题目描述
很久以前,有一个传说中的“EWF”部族,他们世代生活在一个N×M的矩形大地上。虽然,生活的地区有高山、有沼泽,但通过勤劳勇敢,渐渐地,他们在自己的地盘上修筑了一条回路。
后来,“EWF”部族神秘地消失了。不过,考古学家在那片他们曾经生活过的地方找到了一份地图。地图是N×M的矩阵,左上角的坐标为(0, 0),右下角的坐标为(N, M)。矩阵中的每个格子,表示高山、沼泽、平地、房屋或是道路其中之一。如果一个格子表示道路,那么经过这个格子的道路要么是直走,要么是拐弯。如下图,左边2幅表示直走格子的,右边4幅表示需要拐弯的格子。一个表示道路的格子只能表示下列情况之一。

可是,由于地图的年代久远,考古学家虽然能分清一个格子代表的地形,可对于道路的标记,考古学家们只能分清这一格是表示直走的还是拐弯的。现在,他们求助于你,希望你能帮助他们复原这份“EWF”部族的地图。
输入格式
输入文件recover.in的第一行包含两个用空格分隔的正整数N和M,分别表示地图的高和长。
接下来一个N行M列的矩阵描述地图,矩阵中没有多余字符。
大写“S”表示直走的道路,大写“T”表示拐弯的道路,点“.”表示高山、沼泽、平地和房屋。
输出格式
输出文件recover.out包含2N-1行,每行2M-1个字符,描述了这条回路。
所有第2i+1行的2j+1个字符为小写字母o,表示了矩阵的第i行第j列的格子的中心(i, j)。
若回路包含了(i, j)到(i, j+1)或(i, j+1)到(i, j)的一条路径,则第2i+1行的第2j+2个字符为减号“-”(ASCII码为45);
若回路包含了(i, j)到(i+1, j)或(i+1, j)到(i, j)的一条路径,则第2i+2行的第2j+1个字符为竖线“|”(ASCII码为124)。
其它以上未说明位置上的字符为空格(ASCII码为32)。
输入数据保证至少存在一个合法解,故你的输出应有且仅有一条回路。如果存在多组答案,请输出任意一组。
思路:模拟
对T转弯和S直路的处理
此题有一个特殊的性质:
有且仅有一条回路。
也就是说,不能有开放(突出去,不连接别的路)的路。
要保证这条性质成立,应满足以下要求:
- 一个T转弯能向左连,当且仅当左边共有偶数个T转弯。
- 若左边有 个T转弯,那么这个T转弯一定向右。
- 若左边有 个T转弯,那么这个T转弯一定向左与左边的T转弯配对。
- …
- 一个T转弯能向下连,当且仅当上边共有偶数个T转弯,理由同上。
- 对于一个S直路,方向取决于周围T转弯的状态。
实现方式
- 对于T转弯的处理:
- 使用一个数组 记录 位置是否有向下的T转弯。
- 使用一个变量 记录一行内T转弯的数量的奇偶。
- 每遇到一个T转弯,
row ^= 1;,col[i] ^= 1; - 根据 的值,决定是否向右连接路(左边的路已经由上一个T/S处理)。
- 对于S直路的处理:
- 根据 的值,决定是否向右连接路(左边的路已经由上一个T/S处理)。
- 对于跨行路的处理:
- 根据 的值,决定是否向下连接路(上边的路已经由上一个T/S处理)。
AC Code
1 | // template v7 |