题目大意:两个熊孩子点草烧,#代表草,求烧完全部需要的最小时间,点不完所有的输出-1;
解题思路:由于数据小,所以可以枚举两个燃烧点,压入队列,求出最小时间;
代码:
#include <iostream>
#include <stdio.h>
#include <string.h>
#include <queue>
using namespace std;
const int maxn=0xfffffff;
int n,m,t;
char map[210][210];
bool vis[210][210];
int dir[4][2] = {0,1, 1,0, 0,-1, -1,0};
struct node
{
int x,y,step;
}a[110];
bool judge()
{
for(int i=0;i<m;i++)
{
for(int j=0;j<n;j++)
{
if(map[i][j]=='#'&&!vis[i][j])
return 0;
}
}
return 1;
}
int bfs(node s,node e)
{
queue<node>q;
q.push(s);
q.push(e);
vis[s.x][s.y]=1;
vis[e.x][e.y]=1;
while(!q.empty())
{
s=q.front();
q.pop();
e=s;
for(int i=0;i<4;i++)
{
e.x=s.x+dir[i][0];
e.y=s.y+dir[i][1];
e.step=s.step+1;
if(e.x >= 0 && e.x < m && e.y >= 0 && e.y < n && map[e.x][e.y] == '#' && !vis[e.x][e.y])
{
vis[e.x][e.y] = true;
q.push(e);
}
}
}return s.step;
}
int main()
{
cin>>t;
for(int k=1;k<=t;k++)
{
cin>>m>>n;
getchar();
int cnt=0;
for(int i=0;i<m;i++)
{
for(int j=0;j<n;j++)
{
cin>>map[i][j];
if(map[i][j]=='#')
{
a[cnt].x=i;
a[cnt].y=j;
a[cnt++].step=0;
}
}
}
int ans=maxn;
for(int i=0;i<cnt;i++)
{
for(int j=i;j<cnt;j++)
{
memset(vis,0,sizeof(vis));
int temp=bfs(a[i],a[j]);
if(ans>temp&&judge())
ans=temp;
}
}
if(ans == maxn)
printf("Case %d: -1\n", k);
else
printf("Case %d: %d\n", k, ans);
}
return 0;
}