FZU2150
题目名称:Fire Game
题目链接:http://acm.fzu.edu.cn/problem.php?pid=2150
题意:给出一个m*n的图,‘#’表示草坪,‘ . ’表示空地,然后可以选择在任意的两个草坪格子点火,火每秒会向周围四个格子扩散,问选择那两个点使得燃烧所有的草坪花费时间最小?
思路:因为题目数据不大,所以可以从中随便找两个点bfs
代码如下:
#include<cstdio> #include<iostream> #include<cstring> #include<string> #include<cmath> #include<vector> #include<queue> using namespace std; const int INF=0x3f3f3f3f; char a[15][15]; int vis[15][15]; int dir[4][2]={0,1,0,-1,1,0,-1,0}; struct Node { int x,y; int cnt; Node(int x,int y,int cnt) { this->x=x; this->y=y; this->cnt=cnt; } Node(){} }; vector<struct Node> v; queue<Node> q; int t,n,m; int bfs(Node k,Node b) { memset(vis,0,sizeof(vis)); vis[k.x][k.y]=vis[b.x][b.y]=1; k.cnt=0;b.cnt=0; while(!q.empty()) q.pop(); q.push(k);q.push(b); int sum=INF; while(!q.empty()) { Node now=q.front(); q.pop(); sum=now.cnt; for(int i=0;i<4;i++) { Node tmp; tmp.x=now.x+dir[i][0]; tmp.y=now.y+dir[i][1]; tmp.cnt=now.cnt+1; if(tmp.x>=0&&tmp.y>=0&&tmp.x<n&&tmp.y<m&&!vis[tmp.x][tmp.y]&&a[tmp.x][tmp.y]=='#') { vis[tmp.x][tmp.y]=1; q.push(tmp); } } } return sum; } int main() { while(scanf("%d",&t)!=EOF) { for(int ss=1;ss<=t;ss++) { scanf("%d%d%*c",&n,&m); v.clear(); for(int i=0;i<n;i++) { for(int j=0;j<m;j++) { scanf("%c",&a[i][j]); if(a[i][j]=='#') v.push_back(Node(i,j,0)); } getchar(); } int ans=INF; for(int i=0;i<v.size();i++) { for(int j=i;j<v.size();j++) { int tmp=bfs(v[i],v[j]); bool ok=true; for(int k=0;k<n;k++) { for(int f=0;f<m;f++) { if(vis[k][f]==0&&a[k][f]=='#') { ok=false; break; } } if(ok==false) break; } if(ok) { ans = min(ans,tmp); } } } printf("Case %d: ",ss); if(ans==INF) printf("-1\n"); else printf("%d\n",ans); } } return 0; }
本文版权归作者本人所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利.