回到家了- -下午在网吧写了三道,晚上回来没找到合适的桌子敲代码- -就躺被窝里面敲代码了...貌似不是很顺手...这个题目以前见到看不懂意思...没做
题意:给定一张n*m的图,#是草地,‘.’是空地,在两个地方各自放一把火,问烧完所有的草地最短时间是多少...
图的范围是10*10..看起来范围不大..然后就是枚举所有的草地,任意取两个...最差9900种情况...在跑BFS...不太会计算- -抱着试试的态度就做了...然后500+MS..
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<cmath>
#include<queue>
#include<algorithm>
#include<iostream>
using namespace std;
char map[20][20];
int used[20][20],n,m;
int d[4][2]={1,0,-1,0,0,1,0,-1};
int ok(int x,int y)
{
if(x<0||y<0||x>=n||y>=m)
return 0;
if(map[x][y]!='#'||used[x][y]==1)
return 0;
return 1;
}
struct node
{
int x,y,t;
};
int bfs(int ax,int ay,int bx,int by)
{
queue<node> q;
node now,next;
memset(used,0,sizeof(used));
now.x=ax,now.y=ay,now.t=0;
next.x=bx,next.y=by,next.t=0;
used[ax][ay]=used[bx][by]=1;
q.push(now);
q.push(next);
int ans=0x7fffffff;
while(!q.empty())
{
now=q.front();
q.pop();
ans=now.t;
for(int i=0;i<4;i++)
{
next.x=now.x+d[i][0];
next.y=now.y+d[i][1];
next.t=now.t+1;
if(ok(next.x,next.y))
{
used[next.x][next.y]=1;
q.push(next);
}
}
}
return ans;
}
int main()
{
int T;
cin>>T;
node s[200];
for(int cas=1;cas<=T;cas++)
{
int k=0;
memset(map,0,sizeof(map));
cin>>n>>m;
for(int i=0;i<n;i++)
scanf("%s",map[i]);
for(int i=0;i<n;i++)
{
for(int j=0;j<m;j++)
{
if(map[i][j]=='#')
{s[k].x=i;s[k].y=j;k++;}
}
}
int mini=0x7fffffff;
for(int i=0;i<k;i++)
{
for(int j=i;j<k;j++)
{
int ans=bfs(s[i].x,s[i].y,s[j].x,s[j].y);
int flag=1;
for(int x=0;x<n;x++)
{
for(int y=0;y<m;y++)
{
if(used[x][y]==0&&map[x][y]=='#')
{
flag=0;
break;
}
}
if(flag==0)
break;
}
if(flag)
{
mini=min(ans,mini);
}
}
}
printf("Case %d: ",cas);
if(mini==0x7fffffff)
printf("-1\n");
else
printf("%d\n",mini);
}
return 0;
}