• [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 }
  • 相关阅读:
    CentOS7 安装jdk8
    CentOS7 安装和配置 mysql5.7
    CentOS7 安装和配置Tomcat
    vi编辑器设置行号可见
    前端基础-css(2)
    前端基础-css(1)
    前端基础-html(3)
    前端基础-html(2)
    前端基础-html(1)
    IO多路复用、协程
  • 原文地址:https://www.cnblogs.com/kirai/p/5874560.html
Copyright © 2020-2023  润新知