
题意:就是选两个点出发,只能走草坪,看能不能走完所有的草坪
分析:由于数据范围很小,所有枚举这两个点,事先将所有的草坪点存起来,然后任选两个点走,(两个点可以是同一个点)
然后BFS就行了
注:无解的情况很好做,事先深搜判连通块的个数就好,大于2就无解(代码比较烂)
#include<cstdio>
#include<algorithm>
#include<iostream>
#include<cstring>
#include<cmath>
#include<map>
#include<queue>
#include<stdlib.h>
#include<string>
#include<set>
using namespace std;
typedef long long LL;
const int maxn=;
const int INF=0x3f3f3f3f;
int n,m;
struct Point
{
int x,y;
} o,t,a[];
int mp[maxn][maxn],p,h;
int bel[maxn][maxn];
char s[maxn][maxn];
int dx[]= {,,-,};
int dy[]= {-,,,};
void dfs(int x,int y)
{
bel[x][y]=p;
for(int i=; i<; ++i)
{
int e=x+dx[i];
int r=y+dy[i];
if(e<||e>n||r<||r>m)continue;
if(s[e][r]=='.'||bel[e][r])continue;
dfs(e,r);
}
}
queue<Point>q;
int bfs()
{
int ans=;
h=q.size();
while(!q.empty())
{
o=q.front();
q.pop();
for(int i=; i<; ++i)
{
t.x=o.x+dx[i];
t.y=o.y+dy[i];
if(t.x<||t.x>n||t.y<||t.y>m)continue;
if(s[t.x][t.y]=='.'||mp[t.x][t.y]!=-)continue;
mp[t.x][t.y]=mp[o.x][o.y]+;
ans=max(ans,mp[t.x][t.y]);
h++;
q.push(t);
}
}
return ans;
}
int main()
{
int T,cas=;
scanf("%d",&T);
while(T--)
{
scanf("%d%d",&n,&m);
memset(bel,,sizeof(bel));
p=;
for(int i=; i<=n; ++i)
scanf("%s",s[i]+);
int cnt=,ans=INF;
for(int i=; i<=n; ++i)
for(int j=; j<=m; ++j)
if(s[i][j]=='#')
{
if(!bel[i][j])++p,dfs(i,j);
a[cnt].x=i,a[cnt++].y=j;
}
printf("Case %d: ",++cas);
if(p>)
{
printf("-1\n");
continue;
}
bool flag=;
for(int i=; i<cnt; ++i)
{
for(int j=; j<cnt; ++j)
{
if(p==&&bel[a[i].x][a[i].y]==bel[a[j].x][a[j].y])
continue;
h=;
memset(mp,-,sizeof(mp));
mp[a[i].x][a[i].y]=mp[a[j].x][a[j].y]=;
q.push(a[i]);
if(i!=j)q.push(a[j]);
int res=bfs();
if(h==cnt)ans=min(ans,res);
}
}
printf("%d\n",ans);
}
return ;
}