链接:登录—专业IT笔试面试备考平台_牛客网
来源:牛客网
There is an n×mn\times mn×m mirror maze, where there is a mirror on each grid. The mirrors are in one of the following four types:
- ``-'', the light from above or below will be reflected back, the light from left or right will continue going forward without being reflected, respectively;
- ``|'', the light from left or right will be reflected back, the light from above or below will continue going forward without being reflected, respectively;
- ``/'', the light from left, right, above, below will be reflected to go above, below, left, right, respectively;
- ``\\backslash\'', the light from left, right, above, below will be reflected to go below, above, right, left, respectively.
Now there are qqq light sources. Little G, the believer of the light, wants to know the numbers of different mirrors the emitted light will be reflected by within sufficient time for each light source.
输入描述:
The first line contains two integers n,m (1≤n,m≤1 000)n,m\,(1 \le n,m \le 1\,000)n,m(1≤n,m≤1000), denoting the size of the mirror maze. Each of the following nnn lines contains a string of length mmm, where the jjj-th character in the iii-th line Si,j (Si,j∈{∣,−,/,\})S_{i,j}\,(S_{i,j} \in \{|, -, /, \backslash\})Si,j(Si,j∈{∣,−,/,\}) denotes the mirror on grid (i,j)(i,j)(i,j). The next line contains an integer q (1≤q≤105)q\,(1 \le q \le 10^5)q(1≤q≤105), denoting the number of light sources. Each of the following qqq lines contains two integers u (1≤u≤n)u\,(1 \le u \le n)u(1≤u≤n), v (1≤v≤m)v\,(1 \le v \le m)v(1≤v≤m) and a string dir (dir∈{above,below,left,right})dir\,(dir \in \{above, below, left, right\})dir(dir∈{above,below,left,right}), denoting that a light source is on grid (u,v)(u,v)(u,v) and emits light going along the dirdirdir direction. Specifically, the light will not be influenced by the mirror on grid (u,v)(u,v)(u,v) initially.
输出描述:
Output qqq lines each containing one integer, denoting the number of different mirrors the emitted light will be reflected by within sufficient time for each light source.
#include<bits/stdc++.h>
using namespace std;
#define int long long
#define endl '\n'
#define ios ios::sync_with_stdio(false);cin.tie(nullptr);cout.tie(nullptr);
const int N=2e5+5;
const int C=2e3+5;
const int inf=0x3f3f3f3f3f3f3f3f;
int n,m,q,u,v;
string dir;
char mi[C][C];
int vis[C][C][5],ans[C][C][5];
set<pair<int,int>>mp;//记录反射过的镜子坐标
void dfs(int i,int j,int dir) { //射到(i,j)的方向为dir的光线
if(i<1 || j<1 || i>n || j>m) return;//光线出去了
if(vis[i][j][dir] == 2) return;//形成回路
vis[i][j][dir]++;
int now;//反射后的方向
if(mi[i][j] == '|') {
if(dir == 1) now=1;
if(dir == 2) now=2;
if(dir == 3) now=4;
if(dir == 4) now=3;
}
if(mi[i][j] == '\\') {
if(dir == 1) now=3;
if(dir == 2) now=4;
if(dir == 3) now=1;
if(dir == 4) now=2;
}
if(mi[i][j] == '/') {
if(dir == 1) now=4;
if(dir == 2) now=3;
if(dir == 3) now=2;
if(dir == 4) now=1;
}
if(mi[i][j] == '-') {
if(dir == 1) now=2;
if(dir == 2) now=1;
if(dir == 3) now=3;
if(dir == 4) now=4;
}
if(now == 1) dfs(i-1,j,now);
if(now == 2) dfs(i+1,j,now);
if(now == 3) dfs(i,j-1,now);
if(now == 4) dfs(i,j+1,now);
if(now!=dir) mp.insert({i,j});
vis[i][j][dir]=0;
ans[i][j][dir]=mp.size();
}
signed main() {
ios
cin >> n >> m;
for(int i=1; i<=n; i++)
for(int j=1; j<=m; j++) cin >> mi[i][j];
for(int i=1; i<=n; i++) {
mp.clear();
dfs(i,1,4);//在(i,1)处>
mp.clear();
dfs(i,m,3);//在(i,m)处<
}
for(int j=1; j<=m; j++) {
mp.clear();
dfs(1,j,2);//在(1,j)处v
mp.clear();
dfs(n,j,1);//在(n,j)处^
}
for(int i=1; i<=n; i++) { //计算剩余的,即环形光路
for(int j=1; j<=m; j++) {
if(!ans[i][j][1]) {
mp.clear();
dfs(i,j,1);
}
if(!ans[i][j][2]) {
mp.clear();
dfs(i,j,2);
}
if(!ans[i][j][3]) {
mp.clear();
dfs(i,j,3);
}
if(!ans[i][j][4]) {
mp.clear();
dfs(i,j,4);
}
}
}
cin >> q;
while(q--) {
cin >> u >> v >> dir;
if(dir == "above") cout << ans[u-1][v][1] << endl;
if(dir == "below") cout << ans[u+1][v][2] << endl;
if(dir == "left") cout << ans[u][v-1][3] << endl;
if(dir == "right") cout << ans[u][v+1][4] << endl;
}
return 0;
}