码迷,mamicode.com
首页 > 其他好文 > 详细

J - Fire!---UVA 11624

时间:2015-08-03 18:28:49      阅读:108      评论:0      收藏:0      [点我收藏+]

标签:

题目链接

题意:J代表Joe的位置,F代表火的起点,下一刻火将会向四周扩散,求Joe逃离的最短时间,如果不能逃离输出IMPOSSIBLE;

注意火的起点可能不止一处

可以用两次bfs分别求出人到达某个位置所用时间和火到达某个位置所用时间

技术分享
  1 #include<iostream>
  2 #include<stdio.h>
  3 #include<string.h>
  4 #define INF 0xfffffff
  5 #include<queue>
  6 #include<algorithm>
  7 using namespace std;
  8 #define N 1010
  9 
 10 int dir[4][2]={ {1,0},{-1,0},{0,-1},{0,1} };
 11 char map[N][N];
 12 int people[N][N], fire[N][N];//分别代表人和火到达该位置的时间;
 13 int n, m, k, vis[N][N];
 14 struct node
 15 {
 16     int x,y;
 17 }f[N*N];//火的位置;可能不止一处;
 18 
 19 void FireBfs()
 20 {
 21     queue<node> Q;
 22     node p, q;
 23     memset(vis, 0, sizeof(vis));
 24     memset(fire, -1, sizeof(fire));
 25     for(int i=0; i<k; i++)
 26     {
 27         Q.push(f[i]);
 28         fire[f[i].x][f[i].y] = 1;
 29         vis[f[i].x][f[i].y]=1;
 30     }
 31     while(Q.size())
 32     {
 33         p = Q.front(); Q.pop();
 34         for(int i=0; i<4; i++)
 35         {
 36             q.x=p.x+dir[i][0];
 37             q.y=p.y+dir[i][1];
 38             if(q.x>=0 && q.y>=0 && q.x<n && q.y<m && vis[q.x][q.y]==0 && map[q.x][q.y]!=#)
 39             {
 40                 fire[q.x][q.y] = fire[p.x][p.y] + 1;
 41                 vis[q.x][q.y] = 1;
 42                 Q.push(q);
 43             }
 44         }
 45     }
 46 }
 47 int PeopleBfs(node s)
 48 {
 49     queue<node> Q;
 50     node p, q;
 51     memset(vis, 0, sizeof(vis));
 52     memset(people, -1, sizeof(people));
 53     Q.push(s);
 54     people[s.x][s.y] = 1;
 55     vis[s.x][s.y] = 1;
 56     while(Q.size())
 57     {
 58         p = Q.front(); Q.pop();
 59         if(p.x==0||p.x==n-1||p.y==0||p.y==m-1)
 60         {
 61             if((people[p.x][p.y] != -1 && people[p.x][p.y]<fire[p.x][p.y]) || (people[p.x][p.y] != -1&&fire[p.x][p.y] == -1) )//能到达边界并且在火到达之前;
 62                 return people[p.x][p.y];
 63         }
 64 
 65         for(int i=0; i<4; i++)
 66         {
 67             q.x = p.x + dir[i][0];
 68             q.y = p.y + dir[i][1];
 69             if(q.x>=0 && q.x<n && q.y>=0 && q.y<m && vis[q.x][q.y]==0 && map[q.x][q.y]!=#)
 70             {
 71                 people[q.x][q.y] = people[p.x][p.y] + 1;
 72                 vis[q.x][q.y] = 1;
 73                 Q.push(q);
 74             }
 75         }
 76     }
 77     return -1;
 78 }
 79 int main()
 80 {
 81     int T;
 82 
 83     scanf("%d", &T);
 84     while(T--)
 85     {
 86         node J;
 87         scanf("%d%d", &n, &m);
 88         k = 0;
 89         for(int i=0; i<n; i++)
 90         {
 91             scanf("%s", map[i]);
 92             for(int j=0; j<m; j++)
 93             {
 94                 if(map[i][j]==J)
 95                     J.x = i, J.y = j;
 96                 if(map[i][j]==F)
 97                     f[k].x = i,f[k++].y = j;
 98             }
 99         }
100         FireBfs();
101         int ans = PeopleBfs(J);
102         if(ans==-1)
103             printf("IMPOSSIBLE\n");
104         else
105             printf("%d\n", ans);
106     }
107     return 0;
108 }
View Code

 

J - Fire!---UVA 11624

标签:

原文地址:http://www.cnblogs.com/zhengguiping--9876/p/4699976.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!