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; }
相关文章推荐
- FZU - 2150 Fire Game(两点bfs)
- FZU 2150 Fire Game (两点BFS)
- 【Fzu】2150 Fire Game(BFS)
- FZU - 2150 Fire Game —— BFS
- FZU 2150 fire game (bfs)
- FZU2150 Fire Game (bfs)
- fzu 2150 Fire Game(BFS)
- FZU 2150 Fire Game(枚举两个源点的bfs)
- Problem_FZU 2150 Fire Game BFS 两点
- FZU 2150 Fire Game(多起点bfs)
- Fire Game--FZU2150(bfs)
- FZU 2150 Fire Game (BFS)
- FZU Problem 2150 Fire Game (BFS,java)
- FZU - 2150 K - Fire Game BFS(枚举两点)
- FZU 2150 Fire Game(BFS)
- FZU 2150 Fire Game(BFS)
- FZU2150 Fire Game(BFS)
- FZU 2150 Fire Game(dfs+bfs)
- FZU 2150 Fire Game (BFS_好题)
- FZU 2150 Fire Game(bfs)