P15680 [ICPC 2024 Jakarta R] Mirror Maze

题目描述

给定一个包含 $R$ 行(从北到南编号为 $1$ 到 $R$)和 $C$ 列(从西到东编号为 $1$ 到 $C$)的网格。网格中的每个单元格都是大小相同的正方形。位于第 $r$ 行第 $c$ 列的单元格记作 $(r, c)$。每个单元格要么是空的,要么含有一面位于单元格对角线上的镜子。每面镜子由一条线段表示。如果镜子位于单元格从西南角到东北角的对角线上,则称为**类型 $1$**;如果位于另一条对角线上(从西北角到东南角),则称为**类型 $2$**。 这些镜子遵循反射定律,即反射角等于入射角。具体来说,对于类型 $1$ 的镜子,如果一束光从单元格的北、南、西或东侧射入,则它会分别反射到单元格的西、东、北或南侧。类似地,对于类型 $2$ 的镜子,如果一束光从单元格的北、南、西或东侧射入,则它会分别反射到单元格的东、西、南或北侧。 :::align{center} ![](https://cdn.luogu.com.cn/upload/vjudge_pic/CF2045M/f548f2b78769da66f52dac7b762f74c9223ddf85.png) ::: 你想从网格外部放置一个激光器,使得所有镜子都被激光束击中。共有 $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$),激光束向东发射。 :::align{center} ![](https://cdn.luogu.com.cn/upload/vjudge_pic/CF2045M/29c68e47c3b155b917aa2d4237fa93819b498fc4.png) ::: 请确定所有可能的激光器位置,使得所有镜子都被激光束击中。

输入格式

第一行包含两个整数 $R$ $C$($1 \leq R, C \leq 200$)。 接下来的 $R$ 行,每行包含一个长度为 $C$ 的字符串 $S_r$。字符串 $S_r$ 的第 $c$ 个字符表示单元格 $(r, c)$。每个字符可以是 `.`(表示单元格为空)、`/`(表示单元格有类型 $1$ 的镜子)或 `\`(表示单元格有类型 $2$ 的镜子)。网格中至少有一面镜子。

输出格式

输出一个整数,表示所有镜子都被激光束击中的可能激光器位置的数量。记这个数为 $k$。 如果 $k > 0$,则输出 $k$ 个以空格分隔的字符串,表示激光器的位置。每个字符串由一个字符紧接一个整数组成(中间无空格)。字符表示网格的侧边,可以是 `N`、`S`、`E` 或 `W`,分别表示将激光器放置在网格的北、南、东或西侧。整数表示行号或列号。你可以以任意顺序输出这些字符串。

说明/提示

**样例输入/输出 #1 的解释** 下图展示了本样例的一个解。 :::align{center} ![](https://cdn.luogu.com.cn/upload/vjudge_pic/CF2045M/e36d02e4bf94a08c27da9c9fd00e9bc42d7a4647.png) ::: **样例输入/输出 #2 的解释** 下图展示了本样例的一个解。 :::align{center} ![](https://cdn.luogu.com.cn/upload/vjudge_pic/CF2045M/35fe527ce8ee213e9ba2c6ba34c9f6c589c7585c.png) ::: 翻译由 DeepSeek V3.2 完成