您的位置:首页 > 其它

fzu 2150 Fire Game(两点同时bfs)

2014-09-05 19:39 381 查看
 

 

http://acm.fzu.edu.cn/problem.php?pid=2150

 

题目大意:烧草地,两个人同时点燃两块草地,火会向四个方向蔓延,问能否将草地全部烧完。(用Visual c++提交会超时,用GUN c++提交)

 

 

#include<iostream>
#include<queue>
using namespace std;
#define N 12
char map

;
int n,m,s;
struct Node
{
int x,y,v;
};
bool bound(int x,int y)
{
if(x>=0&&x<n&&y>=0&&y<m&&map[x][y]=='#')
return true;
return false;
}
void bfs(int a,int b,int c,int d,int cnt)
{
int i,j,vis

,dir[][2]={0,1,0,-1,1,0,-1,0};
memset(vis,0,sizeof(vis));
Node cur;
queue<Node> q;
cur.x=a;
cur.y=b;
cur.v=0;
q.push(cur);
cur.x=c;
cur.y=d;
cur.v=0;
q.push(cur);
vis[a][b]=vis[c][d]=1;
cnt-=2;
while(!q.empty())
{
for(i=0;i<4;i++)
{
cur.x=q.front().x+dir[i][0];
cur.y=q.front().y+dir[i][1];
if(!vis[cur.x][cur.y]&&bound(cur.x,cur.y))
{
cur.v=q.front().v+1;
q.push(cur);
vis[cur.x][cur.y]=1;
cnt--;
}
}
q.pop();
}
if(cnt==0)
{
if(cur.v<s)//若烧完取用时少的
s=cur.v;
}
}
int main()
{
int i,j,t,k,l,h,cnt;
scanf("%d",&t);
for(h=1;h<=t;h++)
{
scanf("%d%d%*c",&n,&m);
s=9999;
cnt=0;
for(i=0;i<n;i++)
{
scanf("%s",map[i]);
for(j=0;j<m;j++)
{
if(map[i][j]=='#')
cnt++;//草地个数
}
}
if(cnt<=2)//若草地个数少于3,则肯定能烧完
{
printf("Case %d: 0\n",h);
continue;
}
for(i=0;i<n;i++)
for(j=0;j<m;j++)
{
if(map[i][j]=='#')//枚举第一个点
{
for(k=i;k<n;k++)
for(l=(k==i?j+1:0);l<m;l++)
if(map[k][l]=='#')//枚举第二个点
bfs(i,j,k,l,cnt);//两点同时bfs
}
}
printf("Case %d: ",h);
if(s==9999)//代表烧不完
printf("-1\n");
else
printf("%d\n",s);
}
return 0;
}


 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: