#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
const int N = 1010;
int n, m;
char g[N][N];
int res;
void dfs(int x, int y, int q, int cnt) {
if (g[x][y] == 0) { // 如果当前位置没有镜子,更新最大反射次数并返回
res = max(res, cnt);
return;
}
if (g[x][y] == '/') { // 如果当前位置是 / 放置的镜子
if (q == 1) dfs(x, y - 1, 2, cnt + 1); // 向左反射
if (q == 2) dfs(x + 1, y, 1, cnt + 1); // 向下反射
if (q == 3) dfs(x, y + 1, 4, cnt + 1); // 向右反射
if (q == 4) dfs(x - 1, y, 3, cnt + 1); // 向上反射
}
else if (g[x][y] == '\\') { // 如果当前位置是 \ 放置的镜子
if (q == 1) dfs(x, y + 1, 4, cnt + 1); // 向右反射
if (q == 2) dfs(x - 1, y, 3, cnt + 1); // 向上反射
if (q == 3) dfs(x, y - 1, 2, cnt + 1); // 向左反射
if (q == 4) dfs(x + 1, y, 1, cnt + 1); // 向下反射
}
}
int main() {
cin >> n >> m; // 输入田地的行数和列数
for (int i = 1; i <= n; i ++)
for (int j = 1; j <= m; j ++)
cin >> g[i][j]; // 输入田地中镜子的摆放方式
for (int i = 1; i <= n; i ++) { // 遍历每一行
dfs(i, 1, 4, 0); // 从左边发射激光
dfs(i, m, 2, 0); // 从右边发射激光
}
for (int i = 1; i <= m; i ++) { // 遍历每一列
dfs(1, i, 1, 0); // 从上边发射激光
dfs(n, i, 3, 0); // 从下边发射激光
}
cout << res; // 输出最大反射次数
return 0;
}
dfs
函数是一个自定义的深度优先搜索算法实现。它的参数具体含义如下:
- x: 这个参数表示当前正在访问的节点的行坐标。在图的遍历过程中,这个参数用于追踪当前的位置。
- y: 这个参数表示当前正在访问的节点的列坐标。与 x 参数一起,它们确定了图中当前节点的位置。
- q: 这个参数代表从当前节点出发时激光的方向。它影响激光如何在镜子间反射。例如,如果 q 为 1,则表示激光是水平向左发射的;如果为 2,则是垂直向下发射的;如果为 3,则是水平向右发射的;如果为 4,则是垂直向上发射的。
- cnt: 这个参数记录了从初始位置出发到达当前节点的过程中,激光经过的镜子数量,即反射的次数。每次当激光碰到镜子并反射时,这个计数就会增加。