题意: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 }
时间: 2024-10-10 00:36:39