首页 > 代码库 > [UVa11624]Fire!(BFS)

[UVa11624]Fire!(BFS)

题目链接:https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=2671

题意:一个人在树林里要到出口,同时有几个火点在扩展。问这个人能不能跑出树林,最少多少步能跑出去。

先扩展人,再扩展火。在同一个队列里扩展,所以要记下接下来要扩展几个人或者火点。

  1 #include <algorithm>  2 #include <iostream>  3 #include <iomanip>  4 #include <cstring>  5 #include <climits>  6 #include <complex>  7 #include <fstream>  8 #include <cassert>  9 #include <cstdio> 10 #include <bitset> 11 #include <vector> 12 #include <deque> 13 #include <queue> 14 #include <stack> 15 #include <ctime> 16 #include <set> 17 #include <map> 18 #include <cmath> 19  20 using namespace std; 21  22 typedef pair<int, int> PII; 23 typedef struct P { 24     int x; 25     int y; 26     int s; 27     P() {} 28     P(int xx, int yy, int ss) : x(xx), y(yy), s(ss) {} 29 }P; 30  31 const int inf = 0x7f7f7f; 32 const int maxn  = 1010; 33 const int dx[4] = {0, 0, 1, -1}; 34 const int dy[4] = {1, -1, 0, 0}; 35  36 int r, c, jx, jy; 37 vector<PII> fir; 38 int ans; 39 int vis[maxn][maxn]; 40 char G[maxn][maxn]; 41  42 inline int min(int x, int y) { 43     return x < y ? x : y; 44 } 45  46 bool judge(int x, int y) { 47     if(!vis[x][y] && G[x][y] == . && x >= 0 && x < r && y >= 0 && y < c) { 48         return 1; 49     } 50     return 0; 51 } 52  53 bool success(int x, int y) { 54     if(G[x][y] == J &&  55       (x == 0 || x == r - 1 || y == 0 || y == c - 1)) { 56         return 1; 57     } 58     return 0; 59 } 60  61 void init() { 62     memset(vis, 0, sizeof(vis)); 63     memset(G, 0, sizeof(G)); 64     ans = inf;  65     fir.clear(); 66 } 67  68 void bfs() { 69     P q[maxn*maxn]; 70     int front = 0, tail = 0; 71     int fcnt = 0, jcnt = 1, tmp = 0; 72     for(int i = 0; i < fir.size(); i++) { 73         q[tail++] = P(fir[i].first, fir[i].second, 0); 74         vis[fir[i].first][fir[i].second] = 1; 75         fcnt++; 76     } 77     q[tail++] = P(jx, jy, 0); vis[jx][jy] = 1; 78     while(front < tail) { 79         for(int k = 0; k < fcnt; k++) { 80             P f = q[front++]; 81             for(int i = 0; i < 4; i++) { 82                 int xx = f.x + dx[i]; 83                 int yy = f.y + dy[i]; 84                 if(judge(xx, yy) && G[xx][yy] != F) { 85                     vis[xx][yy] = 1; 86                     if(G[xx][yy] != J) { 87                         G[xx][yy] = F; 88                     } 89                     q[tail++] = P(xx, yy, f.s+1); tmp++; 90                 } 91             } 92         } 93         fcnt = tmp; tmp = 0; 94         for(int k = 0; k < jcnt; k++) { 95             P j = q[front++]; 96             if(success(j.x, j.y)) { 97                 ans = min(ans, j.s); 98             } 99             for(int i = 0; i < 4 ; i++) {100                 int xx = j.x + dx[i];101                 int yy = j.y + dy[i];102                 if(judge(xx, yy) && G[xx][yy] != F) {103                     vis[xx][yy] = 1;104                     if(G[xx][yy] != F) {105                         G[xx][yy] = J;106                     }107                     q[tail++] = P(xx, yy, j.s+1); tmp++;108                 }109             }110         }111         jcnt = tmp; tmp = 0;112     }113 }114 115 int main() {116     int T;117     scanf("%d", &T);118     while(T--) {119         init();120         scanf("%d %d", &r, &c);121         for(int i = 0; i < r; i++) {122             scanf("%s", G[i]);123         }124         for(int i = 0; i < r; i++) {125             for(int j = 0; j < c; j++) {126                 if(G[i][j] == J) {127                     jx = i; jy = j;128                 }129                 if(G[i][j] == F) {130                     fir.push_back(PII(i, j));131                 }132             }133         }134         bfs();135         if(ans == inf) {136             printf("IMPOSSIBLE\n");137         }138         else {139             printf("%d\n", ans+1);140         }141     }142     return 0;143 }

 

[UVa11624]Fire!(BFS)