Educational Codeforces Round 118 E. Crazy Robot(topo)
链接
题意:给出一个矩阵,有个实验室,是终点,有墙壁和可以走的路。现在你有一个疯狂的机器人,它除了听你的命令和打碎墙壁什么都会左,比如你让他向左走那他就会往除了左边的其他地方走,现在问对于每个位置,机器人能不能到达实验室。
思路:我们可以发现这其实类似一个topo的过程,特别的,当机器人只有两条路可以走的时候,我们就可以控制它的走向,所以我们从实验室开始topo,当度数小于等于1时,这个点就是可以走的点。
#include<bits/stdc++.h>
using namespace std;
#define endl '\n'
int din[2000010];
int f[4][2] = {{1, 0}, {0, 1}, {-1, 0}, {0, -1}};
int main()
{
int T;
cin >> T;
while (T--) {
int n, m;
cin >> n >> m;
for (int i = 0; i <= (n + 1) * m; i++) din[i] = 0;
vector<char> mp[n + 1];queue<int> Q; int star;
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
char x;
cin >> x;
mp[i].push_back(x);
if (x == 'L') {
Q.push(i * m + j);
star = i * m + j;
}
}
}
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
if (mp[i][j] != '.') continue;
for (int k = 0; k < 4; k++) {
int x = i + f[k][0];
int y = j + f[k][1];
if (x < 0 || x >= n || y < 0 || y >= m || mp[x][y] == '#') continue;
din[i * m + j]++;
}
}
}din[star] = -1;
while (!Q.empty()) {
int q = Q.front(); Q.pop();
int x = q / m, y = q % m;
for (int i = 0; i < 4; i++) {
int xx = x + f[i][0], yy = y + f[i][1];
if (xx < 0 || xx >= n || yy < 0 || yy >= m || mp[xx][yy] == '#' || din[xx * m + yy] == -1) continue;
din[xx * m + yy]--;
if (din[xx * m + yy] <= 1) {
din[xx * m + yy] = -1; Q.push(xx * m + yy); mp[xx][yy] = '+';
}
}
}
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) cout << mp[i][j];cout << endl;
}
}
return 0;
}