FZU 2150 Fire Game BFS

来源:互联网 发布:网络推广协议书 编辑:程序博客网 时间:2024/05/07 11:08

传送门:FZU 2150

题意:给你一个地图,‘#’代表草地,‘.’代表空地,选择两个起火点,使得所有草地能在最短时间内烧完,注意火在每一秒都往四个方向蔓延(有草地的情况下)。

思路:典型BFS,由于数据量很小,我们可以将所有草地的位置记录下来,然后两两枚举,记录最短时间就好了,需要注意的地方就是可能地图中只有一块草地,需要特判一下。

代码:

#include<stdio.h>#include<iostream>#include<string.h>#include<math.h>#include<algorithm>#include<queue>#include<stack>#include<set>#include<vector>#include<map>#define ll long long#define pi acos(-1)#define inf 0x3f3f3f3fusing namespace std;typedef pair<int,int>P;int go[4][2]={1,0,0,1,-1,0,0,-1};int gnum,ans,n,m;bool book[12][12];char mp[12][12];struct node{int r,c;int time;}grass[101];int bfs(node s1,node s2){queue<node>q;while(!q.empty())q.pop();q.push(s1);q.push(s2);book[s1.r][s1.c]=1;book[s2.r][s2.c]=1;int cnt=2;int temp;while(!q.empty()){node t=q.front(),x;temp=t.time;q.pop();for(int i=0;i<4;i++){x.r=t.r+go[i][0];x.c=t.c+go[i][1];x.time=t.time+1;if(0<=x.r&&x.r<n&&0<=x.c&&x.c<m&&!book[x.r][x.c]&&mp[x.r][x.c]=='#'){book[x.r][x.c]=1;q.push(x);cnt++;}}}if(cnt==gnum)ans=min(ans,temp);return cnt;}int main(){int t,k=0;node x;scanf("%d",&t);while(t--){gnum=0;scanf("%d%d",&n,&m);for(int i=0;i<n;i++){scanf("%s",mp[i]);for(int j=0;j<m;j++)if(mp[i][j]=='#'){x.r=i;x.c=j;x.time=0;grass[gnum++]=x;}}if(gnum==1){printf("Case %d: 0\n",++k);continue;}ans=inf;bool flag=0;for(int i=0;i<gnum;i++){for(int j=i+1;j<gnum;j++){memset(book,0,sizeof(book));if(bfs(grass[i],grass[j])==gnum)flag=1;}}if(flag)printf("Case %d: %d\n",++k,ans);elseprintf("Case %d: -1\n",++k);}    return 0;}


0 0
原创粉丝点击