[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
");
137         }
138         else {
139             printf("%d
", ans+1);
140         }
141     }
142     return 0;
143 }
原文地址:https://www.cnblogs.com/kirai/p/5874560.html