题目大意:
一个二维的图上,’#‘ 代表草,’.'代表地板,刚开始可以随机点燃俩个个地方的草,草燃烧后会想上下左右四个方向燃烧,问任意点燃两个草的情况下最快几步可以把草燃烧完(可以点燃同一个地方)
思路:
因为这个题数据量小,可以遍历,先遍历第一个草,再进入第二次遍历找第二个,然后BFS找到这个情况下最小的步数,把所有情况列出来找到最小的值
#include<iostream>
#include<string>
#include<queue>
#include<stack>
#include<string.h>
#include<cstdio>
#include<algorithm>
using namespace std;
#define inf 0x3f3f3f
int m,n,t;
const int N=15;
char s[N][N];
int v[N][N];
int dx[]={1,-1,0,0};
int dy[]={0,0,-1,1};
struct node
{
int x;
int y;
};
queue<node> que;
int bfs(int x1,int y1,int x2,int y2)
{
node p1,p2,cur,next;
int xx,yy;
memset(v, inf, sizeof(v));
p1.x=x1,p1.y=y1;
p2.x=x2,p2.y=y2;
v[x1][y1]=0;
v[x2][y2]=0;
que.push(p1);
que.push(p2);
while(!que.empty())
{
cur=que.front();
que.pop();
for(int i=0;i<4;i++)
{
xx=cur.x+dx[i];
yy=cur.y+dy[i];
if(xx>=0&&xx<m&&yy>=0&&yy<n&&s[xx][yy]=='#'&&v[xx][yy]>v[cur.x][cur.y]+1)
{
v[xx][yy] = v[cur.x][cur.y]+1;
next.x=xx;
next.y=yy;
que.push(next);
}
}
}
int maxx=0;
for(int i=0;i<m;i++)
for(int j=0;j<n;j++)
{
if(s[i][j]=='#')
maxx=max(maxx,v[i][j]);
}
return maxx;
}
int main()
{
cin>>t;
for(int iii=1;iii<=t;iii++)
{
while(!que.empty()) que.pop();
cin>>m>>n;
for(int i=0;i<m;i++)
for(int j=0;j<n;j++)
cin>>s[i][j];
int temp;
int ans = inf;
for(int i=0;i<m;i++)
for(int j=0;j<n;j++)
if(s[i][j]=='#')
for(int ii=0;ii<m;ii++)
for(int jj=0;jj<n;jj++)
{
if(s[ii][jj]=='#')
{
temp=bfs(i,j,ii,jj);
ans = min(temp,ans);
}
}
if(ans==inf) cout << "Case " << iii << ": " << -1 << endl;
else cout << "Case " << iii << ": " << ans << endl;
}
return 0;
}