CF2045M Mirror Maze
题目描述
# 镜子迷宫
给定一个有\(R\)行(从北到南编号为\(1\)到\(R\))和\(C\)列(从西到东编号为\(1\)到\(C\))的网格。这个网格中的每个方格大小相同。位于第\(r\)行和第\(c\)列的方格表示为\((r,c)\)。每个方格要么为空,要么在方格的一条对角线上有一面镜子。每面镜子由一条线段表示。如果镜子是从西南角到东北角斜着放置的,则为\(1\)型镜子;如果是另一条对角线方向,则为\(2\)型镜子。
这些镜子遵循反射定律,即反射角等于入射角。正式地说,对于\(1\)型镜子,如果一束光线从方格的北、南、西或东方向射入,那么它将分别被反射到方格的西、东、北和南方向。类似地,对于\(2\)型镜子,如果一束光线从方格的北、南、西或东方向射入,那么它将分别被反射到方格的东、西、南和北方向。
你想要在网格外放置一个激光发射器,使得激光束能击中所有的镜子。有\(2\cdot(R + C)\)个可能放置激光发射器的位置:
- 从网格北侧的第\(c\)列(\(1\leq c\leq C\)),向南发射激光束;
- 从网格南侧的第\(c\)列(\(1\leq c\leq C\)),向北发射激光束;
- 从网格东侧的第\(r\)行(\(1\leq r\leq R\)),向西发射激光束;
- 从网格西侧的第\(r\)行(\(1\leq r\leq R\)),向东发射激光束。
确定所有可能放置激光发射器的位置,使得激光束能击中所有的镜子。
输入格式
第一行包含两个整数\(R\)和\(C\)(\(1\leq R,C\leq200\))。
接下来的\(R\)行,每行包含一个长度为\(C\)的字符串\(S_r\)。字符串\(S_r\)的第\(c\)个字符表示方格\((r,c)\)。每个字符可以是“.”(如果方格为空)、“/”(如果方格有\(1\)型镜子)或者“\”(如果方格有\(2\)型镜子)。网格中至少有一面镜子。
输出格式
输出一个整数,表示能使激光束击中所有镜子的激光发射器的可能放置位置的数量,记为\(k\)。
如果\(k>0\),则输出\(k\)个用空格分隔的字符串,表示激光发射器的位置。每个字符串由一个字符和一个紧跟其后的整数组成,中间没有空格。这个字符表示网格的边,如果将激光发射器放在网格的北、南、东或西边,则字符分别为\(N\)、\(S\)、\(E\)或\(W\)。这个整数表示行/列编号。你可以按任意顺序输出这些字符串。
说明/提示
样例输入/输出 #1的解释
下面的图示展示了这个样例的一个解决方案。
样例输入/输出 #2的解释
下面的图示展示了这个样例的一个解决方案。
