J - Fire!---UVA 11624

题目链接

题意: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

 

posted @ 2015-08-03 17:57  西瓜不懂柠檬的酸  Views(263)  Comments(0Edit  收藏  举报
levels of contents