题目链接:
I-Mirror Maze_2024牛客暑期多校训练营1 (nowcoder.com)
分析:
对于每面镜子对应着上、下、左、右射来的广四种状态,使用 D[N][N][5] 记录每种状态是否经过,若同一种状态被访问两次,则存在回路,跳出DFS。
另外用 v[N][N] 记录是否发生反射,注意对于 | 和 - 这两种镜子,分别从上、下和左、右的光不反射,此时不能标记v[N][N]为1。注意每次DFS后将D和v值为0。
AC代码:
#include<bits/stdc++.h>
using namespace std;
const int N=1005;
int n, m, q, v[N][N];
bool D[N][N][5];
string c[N];
string s[5]={" ","above","below","left","right"};
int dfs(int x, int y, int d) {
if (D[x][y][d] == 1 || x < 1 || x > n || y < 1 || y > m) return 0;
int cnt = 0;
// cout << '(' << x << "," << y << ')' << endl;
if(d == 1){
if(c[x][y] == '|') cnt = dfs(x+1, y, 1);
else{
cnt -= v[x][y];
v[x][y]=1, D[x][y][d]=1;
D[x][y][d]=1;
if(c[x][y] == '-') cnt += dfs(x-1, y, 2) + 1;
else if(c[x][y] == '\\') cnt += dfs(x, y+1, 3) + 1;
else if(c[x][y] == '/') cnt += dfs(x, y-1, 4) + 1;
v[x][y]=0,D[x][y][d]=0;
}
}
else if(d == 2){
if(c[x][y] == '|') cnt = dfs(x-1, y, 2);
else{
cnt -= v[x][y];
v[x][y]=1, D[x][y][d]=1;
if(c[x][y] == '-') cnt += dfs(x+1, y, 1) + 1;
else if(c[x][y] == '\\') cnt += dfs(x, y-1, 4) + 1;
else if(c[x][y] == '/') cnt += dfs(x, y+1, 3) + 1;
v[x][y]=0,D[x][y][d]=0;
}
}
else if(d == 3){
if(c[x][y] == '-') cnt = dfs(x, y+1, 3);
else{
cnt -= v[x][y], D[x][y][d]=1;
v[x][y]=1;
if(c[x][y] == '|') cnt += dfs(x, y-1, 4) + 1;
else if(c[x][y] == '\\') cnt += dfs(x+1, y, 1) + 1;
else if(c[x][y] == '/') cnt += dfs(x-1, y, 2) + 1;
v[x][y]=0,D[x][y][d]=0;
}
}
else if(d == 4){
if(c[x][y] == '-') cnt = dfs(x, y-1, 4);
else{
cnt -= v[x][y], D[x][y][d]=1;
v[x][y]=1;
if(c[x][y] == '|') cnt += dfs(x, y+1, 3) + 1;
else if(c[x][y] == '\\') cnt += dfs(x-1, y, 2) + 1;
else if(c[x][y] == '/') cnt += dfs(x+1, y, 1) + 1;
v[x][y]=0,D[x][y][d]=0;
}
}
return cnt;
}
int main() {
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
cin >> n >> m;
for (int i = 1; i <= n; i++){
cin>>c[i];
c[i]=" "+c[i];
}
cin >> q;
while (q--) {
int x, y;
string d;
cin>>x>>y>>d;
if (d == s[1]) cout << dfs(x - 1, y, 2) << '\n';
else if (d == s[2]) cout << dfs(x + 1, y, 1) << '\n';
else if (d == s[3]) cout << dfs(x, y - 1, 4) << '\n';
else if (d == s[4]) cout << dfs(x, y + 1, 3) << '\n';
}
return 0;
}