这道题说白了,其实就是最短路径问题,果断用宽搜,但是我们这里要注意的是,
这道题是两个起点的宽搜,两个同时搜,而不是分开搜,我本人就是因为这个错误而做了很久的
#include<iostream>
#include<cstring>
#include<queue>
using namespace std;
const int maxn=20;
const int inf=0x3f3f3f3f;
char a[maxn][maxn];
//char b[maxn][maxn];
int step[maxn][maxn];
int usedtime=111111111;
int direction[4][2]={{0,1},{1,0},{-1,0},{0,-1}};
int column,line;
int ans=0;
int grasses;
int cases=0;
struct wo{
int x;
int y;
};
queue<wo>p;
int fire(){
int grass=0,time=0;
while(p.size()){
struct wo help;//结构体的入队需要结构体才能入队
help=p.front();p.pop();
for(int i=0;i<4;i++){
int x1=help.x+direction[i][0],y1=help.y+direction[i][1];
if(x1<1||x1>line)continue;
if(y1<1||y1>column)continue;
if(a[x1][y1]=='.')continue;
if(step[x1][y1]<=step[help.x][help.y]+1)continue;//满足条件才入队
step[x1][y1]=step[help.x][help.y]+1;
wo help1;
help1.x=x1;help1.y=y1;
p.push(help1);
grass++;//计算燃烧的草的个数
time=max(step[x1][y1],time);//算时间
}
}
if(grass==grasses-2)return time;//看燃烧完没有
else return 111111111;
}
int main()
{
int t;
cin>>t;
while(t--){
usedtime=111111111,grasses=0;
cin>>line>>column;
for(int i=1;i<=line;i++){
for(int j=1;j<=column;j++){
cin>>a[i][j];
if(a[i][j]=='#')grasses++;//计算草的个数
}
}
for(int i=1;i<=line;i++){
for(int j=1;j<=column;j++){
if(a[i][j]=='.')continue;//只从有草的地方开始燃烧
for(int s=1;s<=line;s++){
for(int l=1;l<=column;l++){
if(a[s][l]=='.')continue;
if(l<=column){
while(p.size())p.pop();
if(i!=s||j!=l){
//cout<<a[i][j]<<" "<<a[s][l]<<endl;
memset(step,inf,sizeof(step));
wo ll;
ll.x=i;ll.y=j;step[i][j]=0;
p.push(ll);
ll.x=s;ll.y=l;step[s][l]=0;
p.push(ll);
int ff=fire();
usedtime=min(usedtime,ff);
}
}
}
}
}
}
cout<<"Case"<<" "<<++cases<<": ";
if(usedtime!=111111111)
cout<<usedtime<<endl;
else cout<<-1<<endl;
}
}