三个小时我不知道崩溃了多少次…真的心态爆炸
这题我以为比油田简单点,结果简单搜索题并不简单…我直接裂开
有力气之后再回来补一下题解好了..
#include <iostream>
#include <queue>
#include <cstring>
#define x first
#define y second
using namespace std;
typedef pair<int, int> PII;
const int N = 11;
int t;
int n, m;
char g[N][N];
int d[N][N];
int res ;
int dx[] = {-1, 0, 1, 0}, dy[] = {0, -1, 0, 1};
int st[N][N];
vector<PII> v;
PII p;
void dfs(int x, int y) {
st[x][y] = 1;
p.x = x, p.y = y;
v.push_back(p);
for (int i = 0; i < 4; i++) {
int a = x + dx[i], b = y + dy[i];
if (a < 0 || a > n - 1 || b < 0 || b > m - 1 || g[a][b] == '.' || st[a][b])
continue;
dfs(a, b);
}
return;
}
int bfs(PII a, PII b) {
int mx = 0, cnt = 0;
memset(d, -1, sizeof d);
memset(st, 0, sizeof st);
queue<PII> q;
if (a != b) {
q.push(a);
cnt++;
}
q.push(b);
cnt++;
d[a.x][a.y] = 0, d[b.x][b.y] = 0;
st[a.x][a.y] = 1, st[b.x][b.y] = 1;
while (q.size()) {
PII t = q.front();
q.pop();
for (int i = 0; i < 4; i++) {
int tx = t.x + dx[i], ty = t.y + dy[i];
if (tx < 0 || tx > n - 1 || ty < 0 || ty > m - 1 || st[tx][ty] || g[tx][ty] == '.')
continue;
d[tx][ty] = d[t.x][t.y] + 1;
mx = max(mx, d[tx][ty]);
p.x = tx, p.y = ty;
st[tx][ty] = 1;
q.push(p);
cnt++;
}
}
// printf("cnt: %d, mx: %d, v.size(): %d\n", cnt, mx, v.size());
// for (int i = 0; i < n; i++) {
// for (int j = 0; j < m; j++) {
// printf("%d ", d[i][j]);
// }
// puts("");
// }
// puts("");
if (cnt == v.size())
return mx;
return -1;
}
int main() {
cin >> t;
int Case = 1;
while (t--) {
cin >> n >> m;
for (int i = 0; i < n; i++)
for (int j = 0; j < m; j++)
cin >> g[i][j];
memset(st, 0, sizeof st); // 记得每轮新的测试要清空st
memset(d, -1, sizeof d);
v.clear();
int f = 0; // 连通块的数量
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
if (g[i][j] == '#' && !st[i][j]) {
dfs(i, j);
f++;
}
}
}
res = 100; // 取个大点的值,然后找最小,肯定大不过100
if (f > 2 || f == 0) {
printf("Case %d: -1\n", Case++);
continue;
} else {
int s = v.size();
for (int i = 0; i < s; i++) {
for (int j = i ; j < s; j++) {
int dist = bfs(v[i], v[j]);
if (dist != -1)
res = min(res, dist);
}
}
// for (int i = 0; i < s; i++) {
// for (int j = i; j < s; j++) {
// bfs(v[i], v[j]);
// cout << "res: " << res << endl;
// }
// }
printf("Case %d: %d\n", Case++, res);
}
}
return 0;
}