题意:给定一个n*m的迷宫(1~1000),包含以下符号:
'#':墙(’J'和‘F'都不能到达这个点);
'.':'J'和'F'能到达的点;
'J':J的初始位置('J'有且只有一个);
'F':F的初始位置(可以有很多,也可以没有)。
’J'和'F'同时扩散。问J是否能冲出去(超过n*m这个框就ok了),如果冲不出去打印"IMPOSSIBLE"。
题解:先bfs‘F'(多起点BFS)——注意:不能任意都能过,比如.#F。如果不考虑’#‘,’.'=2,本来应该到达不了的。
然后再bfs‘J'即可,不能让’F'追上就ok了。
//通常来说,我debug的时间,都太久了【吐血】(或许因为总是再用代码d,而不是用脑子emmmmmmmmm)。
代码:
#include <bits/stdc++.h>
// #define int long long
#define pb push_back
#define mst(a, i) memset(a, i, sizeof(a))
#define dbg(x) cout << #x << "===" << x << endl
using namespace std;
void read(int &x) {
int res = 0, f = 1;
char c = getchar();
while (c < '0' || c > '9') {
if (c == '-') f = -1;
c = getchar();
}
while (c >= '0' && c <= '9')
res = (res << 3) + (res << 1) + (c - '0'), c = getchar();
x = f * res;
}
void OUT(int x) {
if (x < 0) putchar('-'), x = -x;
if (x > 9) OUT(x / 10);
putchar(x % 10 + '0');
}
void print(int a, char c) { OUT(a), putchar(c); }
const int maxn = 1e3 + 10;
const int mod = 1e9 + 7;
struct node {
int x, y;
node() {}
node(int _x, int _y) { x = _x, y = _y; }
};
vector<node> F;
node J;
char c[maxn][maxn];
int dx[] = {1, -1, 0, 0}, dy[] = {0, 0, 1, -1};
int n, m;
int FX[maxn][maxn], JX[maxn][maxn];
void bfs_F() {
mst(FX, -1);
queue<node> q;
for (auto i : F) {
q.push(i), FX[i.x][i.y] = 0;
}
while (!q.empty()) {
node now = q.front();
q.pop();
int x = now.x, y = now.y;
for (int i = 0; i < 4; i++) {
int nx = x + dx[i], ny = y + dy[i];
if (nx >= 1 && nx <= n && ny >= 1 && ny <= m && FX[nx][ny] == -1 &&
c[nx][ny] !=
'#') //穿墙会改变速度,比如.#F明明到不了,如果之前那样写就到的了了。
q.push(node(nx, ny)), FX[nx][ny] = FX[x][y] + 1;
}
}
}
int bfs() {
mst(JX, -1);
queue<node> q;
q.push(J);
JX[J.x][J.y] = 0;
while (!q.empty()) {
node now = q.front();
q.pop();
int x = now.x, y = now.y;
for (int i = 0; i < 4; i++) {
int nx = x + dx[i], ny = y + dy[i];
// cout << ">>>" << nx << " " << ny << endl;
if (nx < 1 || nx > n || ny < 1 || ny > m) return JX[x][y] + 1;
if (nx >= 1 && nx <= n && ny >= 1 && ny <= m && JX[nx][ny] == -1 &&
(FX[nx][ny] > JX[x][y] + 1 || FX[nx][ny] == -1) &&
c[nx][ny] == '.')
q.push(node(nx, ny)), JX[nx][ny] = JX[x][y] + 1;
}
}
return -1;
}
void init() { F.clear(); }
signed main() {
int T;
read(T);
while (T--) {
init();
read(n), read(m);
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= m; j++) {
cin >> c[i][j];
if (c[i][j] == 'J') J = node(i, j);
if (c[i][j] == 'F') F.pb(node(i, j));
}
}
bfs_F();
/*for (int i = 1; i <= n; i++) {
for (int j = 1; j <= m; j++) {
print(FX[i][j], ' ');
}
puts("");
}*/
int f = bfs();
if (f == -1)
puts("IMPOSSIBLE");
else
print(f, '\n');
}
return 0;
}
/*
2
4 4
####
#JF#
#..#
#..#
3 3
###
#J.
#.F
*/