#CF2045M. 镜子迷宫
镜子迷宫
M. 镜子迷宫
每个测试点时间限制: 秒
每个测试点内存限制: 兆字节
给定一个 行(从北到南编号 到 )和 列(从西到东编号 到 )的网格。每个格子是相同大小的正方形。位于第 行第 列的格子记为 。每个格子可以是空的,也可以在格子的一条对角线上放置一面镜子。镜子用一条线段表示。如果镜子位于从西南角到东北角的对角线上,则称为类型 ;如果位于另一条对角线上,则称为类型 。
这些镜子遵循反射定律,即入射角等于反射角。具体地,对于类型 镜子,如果光束从北、南、西、东方向进入格子,则它将被分别反射到西、东、北、南方向。类似地,对于类型 镜子,如果光束从北、南、西、东方向进入格子,则它将被分别反射到东、西、南、北方向。
你想要从网格外部放置一个激光器,使得所有镜子都被激光束击中。共有 个可能的位置:
- 从网格北侧,第 列,向南发射激光束,其中 ;
- 从网格南侧,第 列,向北发射激光束,其中 ;
- 从网格东侧,第 行,向西发射激光束,其中 ;
- 从网格西侧,第 行,向东发射激光束,其中 。
确定所有可能的激光器位置,使得所有镜子都被激光束击中。
输入
第一行包含两个整数 和 ()。
接下来 行,每行一个长度为 的字符串 。字符串 的第 个字符表示格子 。每个字符可以是 .(空单元格)、/(类型 镜子)或 \(类型 镜子)。网格中至少有一面镜子。
输出
输出一个整数,表示可能的激光器位置的数量,记作 。
如果 ,则接下来输出 个空格分隔的字符串,每个字符串表示一个激光器位置。字符串由一个字符后紧跟一个整数组成,字符表示网格的边:N(北)、S(南)、E(东)或 W(西),整数表示行号或列号。你可以按任意顺序输出这些字符串。
样例
输入
4 4
.//.
.\\.
.\/.
....
输出
2
N3 W2
输入
4 6
./..\.
.\...\
./../\
......
输出
2
E3 S2
输入
4 4
....
./\.
.\/.
....
输出
0
样例解释
对于样例 #1:下图展示了其中一个解。
对于样例 #2:下图展示了其中一个解。