AC代码:
#include <iostream>
#include <cstdio>
#include <cstring>
#include <string>
#include <queue>
#include <vector>
#include <algorithm>
#define INF 0x3f3f3f3f
using namespace std;
struct node{
int x,y,t;
//用优先队列一直超时
};
const int dx[] = {-1,0,1,0},dy[] = {0,-1,0,1};
char maze[15][15];
int vis[15][15];
int n,m;
int bfs(node a,node b){
memset(vis,0,sizeof(vis));
queue<node> q;
node cur;
vis[a.x][a.y] = vis[b.x][b.y] = 1;
q.push(a);q.push(b);
int ans = 0;
while(!q.empty()){
cur = q.front();
q.pop();
ans = max(ans,cur.t);
for(int i = 0; i < 4; i++){
int xx = cur.x+dx[i],yy = cur.y+dy[i];
if(xx < 0 || xx >= n || yy < 0 || yy >= m || maze[xx][yy] != '#' || vis[xx][yy])
continue;
vis[xx][yy] = 1;
q.push((node){xx,yy,cur.t+1});
}
}
for(int i = 0; i < n; i++){
for(int j = 0; j < m; j++){
if(maze[i][j] == '#' && !vis[i][j]){
return INF;
}
}
}
return ans;
}
int main(){
int T,t = 1;
scanf("%d",&T);
while(T--){
vector<node> v;
int cnt = 0;
scanf("%d%d",&n,&m);
for(int i = 0; i < n; i++){
scanf("%s",maze[i]);
for(int j = 0; j < m; j++){
if(maze[i][j] == '#'){
cnt++;
v.push_back((node){i,j,0});
}
}
}
printf("Case %d: ",t++);
int ans = INF;
for(int i = 0; i < cnt; i++){
for(int j = i; j < cnt; j++){
ans = min(ans,bfs(v[i],v[j]));
}
}
if(ans == INF)
printf("-1\n");
else
printf("%d\n",ans);
}
return 0;
}