FZU 2150Fire Game (BFS_好题)

来源:互联网 发布:mindmapping 软件 编辑:程序博客网 时间:2024/06/03 11:51


题意:给出一个m*n的图,‘#’表示草坪,‘ . ’表示空地,然后可以选择在任意的两个草坪格子点火,火每 1 s会向周围四个格子扩散,问选择那两个点使得燃烧所有的草坪花费时间最小?


分析:这个题目如果考虑技巧的话有点难度,但是鉴于数据范围比较小,我们可以暴力枚举任意的草坪所在的点,然后两个点压进队列里面BFS,去一个满足条件的最小值即可。

顺便说一下 fzu 2141 Sub-Bipartite Graph 的思路,比赛的时候没有做出来。

这个题目想的复杂了,完了之后发现别人用贪心二分染色,每个点贪心选择与它相连点的颜色较多的相反的颜色,这样就可以了。看来当时真是想复杂了。


#include<iostream>#include<cstdio>#include<cstring>#include<algorithm>#include<queue>#include<vector>using namespace std;int vis[11][11];char M[11][11];int dx[]={0,1,0,-1},dy[]={1,0,-1,0}; int n,m;struct node{int x;int y;int cnt;}a[111];vector<node>b;queue<node>qq;bool check(int x,int y){if(x<1||x>n||y<1||y>m) return false;return true;}int  bfs(){node s1;int x1,y1,temp;temp=0;while(!qq.empty()) {s1=qq.front();qq.pop();vis[s1.x][s1.y]=1;for(int i=0;i<4;i++) {x1=s1.x+dx[i];y1=s1.y+dy[i];if(check(x1,y1)&&M[x1][y1]=='#'&&vis[x1][y1]==0) {vis[x1][y1]=1;qq.push((node){x1,y1,s1.cnt+1});temp=max(temp,s1.cnt+1);}}}return temp;}int main(){int T,i,j,temp,ans;int z,k;char s[11];scanf("%d",&T);for(int _=1;_<=T;_++) {b.clear();ans=222;scanf("%d%d",&n,&m);for(i=1;i<=n;i++) {scanf("%s",s);for(j=1;j<=m;j++) {M[i][j]=s[j-1];if(M[i][j]=='#') b.push_back((node){i,j,0});}}for(i=0;i<b.size();i++) {for(j=i;j<b.size();j++) {memset(vis,0,sizeof(vis));while(!qq.empty()) qq.pop();qq.push(b[i]);qq.push(b[j]);temp=bfs();for( z=1;z<=n;z++) {for( k=1;k<=m;k++) {if(vis[z][k]==0&&M[z][k]=='#') break;} if(k<=m) break;}if(z>n) ans=min(ans,temp);}}if(ans==222) ans=-1;printf("Case %d: %d\n",_,ans);}return 0;} 


0 0