#ABC358F. 最简单的迷宫
最简单的迷宫
最简单的迷宫
题目描述
Snuke 计划在 AtCoder Land 建造一个新设施——迷宫。迷宫用 行 列的网格表示,最右上角格子的上边缘是入口,最右下角格子的下边缘是出口。他将在相邻格子之间适当放置墙壁来建造迷宫。
他喜欢简单的迷宫,因此希望从入口到出口的路径恰好经过 个格子,且没有任何分叉。判断能否建造这样的迷宫,如果可能,请构造一个。
例如,在下图中,,,墙壁放置在实线处(除入口和出口外,外围总是有墙壁)。此时,从入口到出口的路径恰好经过 个格子,且没有分叉。
下面是形式化描述。
有一个 行 列的网格。设 表示从上数第 行、从左数第 列的格子。对于每对边相邻的格子,你可以决定是否在它们之间放置墙壁。判断能否通过放置墙壁满足以下条件,如果可能,请构造一种放置方案。
考虑一个有 个顶点的无向图 。 的每个顶点用整数对 唯一标记。
两个不同顶点 和 之间有边相连,当且仅当 ,且网格中对应的格子 和 之间没有墙壁。
条件:存在一条连接顶点 和 的、包含 个顶点的简单路径,并且包含顶点 和 的连通分量只由这条路径组成。
输入格式
输入按以下格式从标准输入给出:
输出格式
如果不存在满足条件的墙壁放置方案,输出 No。否则,按以下格式输出一种放置方案。如果存在多种合法方案,可以输出任意一种。
输出格式比较复杂,请结合下面的样例输出来理解。
Yes
+++++ … +++S+
+o?o? … ?o?o+
+?+?+ … +?+?+
+o?o? … ?o?o+
+?+?+ … +?+?+
⋮
+o?o? … ?o?o+
+?+?+ … +?+?+
+o?o? … ?o?o+
+++++ … +++G+
这里,S、G、+、o 分别表示入口、出口、墙壁、格子,格子之间的 ? 表示可以放置墙壁的位置。将水平相邻的两个格子之间的 ? 替换为 |(放置墙壁时)或 .(不放置墙壁时)。将垂直相邻的两个格子之间的 ? 替换为 -(放置墙壁时)或 .(不放置墙壁时)。
下面是形式化说明。
输出由 行组成。第 行输出字符串 Yes,第 行到第 行输出长度为 的字符串,具体如下。
第 行是 + 重复 次后接 S 再接 + 的拼接。
第 行()是按 +、o、、o、、、、o、+ 的顺序拼接得到的字符串。这里,如果格子 和 之间放置了墙壁,则 为 |,否则为 .。
第 行()是按 +、、+、、+、、+、、+ 的顺序拼接得到的字符串。这里,如果格子 和 之间放置了墙壁,则 为 -,否则为 .。
第 行是 + 重复 次后接 G 再接 + 的拼接。
样例
3 3 7
Yes
+++++S+
+o.o.o+
+.+-+-+
+o.o.o+
+-+-+.+
+o.o|o+
+++++G+
这与题目描述中的图所示的墙壁放置方案相同。
3 3 2
No
4 1 4
Yes
+S+
+o+
+.+
+o+
+.+
+o+
+.+
+o+
+G+
数据范围
- 所有输入值均为整数。
提示
答案不唯一,输出任意合法解即可。
- ID
- 3331
- 类型
- 传统题
- Time Limit
- 2000ms
- Memory Limit
- 1024MiB
- 上传者