zoukankan      html  css  js  c++  java
  • UVA 11624

    题目链接:https://cn.vjudge.net/problem/UVA-11624

    题意:

    给出一个 n×m 的矩阵,上面有的格子能走,有的格子是墙不能走。

    有若干个点是火源,火每分钟都往上下左右蔓延一格(不能越墙)。又给出一个点是Joe的出发点,他只要能在不碰到火的前提下走出该矩阵,就算逃生成功,要求最小的逃生时间。

    题解:

    显然可以把火和人一起扔进队列里BFS,只要初始状态的时候火比人先进队,那么往后在BFS的每一层内永远都是火比人先进队。

    然后,book数组正好也可以用来被火给标记掉,可以使得当前时间下人不能走火走过格子。

    AC代码:

    #include<bits/stdc++.h>
    using namespace std;
    const int maxn = 1003;
    const int INF = 0x3f3f3f3f;
    const int dx[4] = { 1,0,-1,0 };
    const int dy[4] = { 0,1,0,-1 };
    
    int n, m;
    char tmp[maxn];
    int mp[maxn][maxn];
    
    struct Node {
       bool fire;
       int x, y;
       int step;
       Node() {}
       Node(bool _fire, int _x, int _y, int _step) {
           fire = _fire;
           x = _x, y = _y;
           step = _step;
       }
    }joe, fire[maxn*maxn];
    int firecnt;
    
    int vis[maxn][maxn];
    queue<Node> Q;
    inline bool border(Node o) {
       return o.x == 1 || o.x == n || o.y == 1 || o.y == m;
    }
    int bfs()
    {
       memset(vis, 0, sizeof(vis));
       while (!Q.empty()) Q.pop();
    
       for (int i = 1; i <= firecnt; i++)
       {
           fire[i].fire = 1;
           fire[i].step = 0;
           Q.push(fire[i]);
           vis[fire[i].x][fire[i].y] = 1;
       }
    
       joe.step = joe.fire = 0;
       Q.push(joe);
       vis[joe.x][joe.y] = 1;
    
       while (!Q.empty())
       {
           Node now = Q.front(); Q.pop();
           if (!now.fire && border(now)) return now.step;
           for (int k = 0; k < 4; k++)
           {
               Node nxt = Node(now.fire, now.x + dx[k], now.y + dy[k], now.step + 1);
               if (mp[nxt.x][nxt.y]) continue;
               if (vis[nxt.x][nxt.y]) continue;
               vis[nxt.x][nxt.y] = 1;
               Q.push(nxt);
           }
       }
       return -1;
    }
    
    int main()
    {
       int T;
       cin >> T;
       while (T--)
       {
           scanf("%d%d", &n, &m);
           memset(mp, 1, sizeof(mp));
           firecnt = 0;
           for (int i = 1; i <= n; i++)
           {
               scanf("%s", tmp + 1);
               for (int j = 1; j <= m; j++)
               {
                   if (tmp[j] == '#') mp[i][j] = 1;
                   if (tmp[j] == '.') mp[i][j] = 0;
                   if (tmp[j] == 'J') joe.x = i, joe.y = j, mp[i][j] = 0;
                   if (tmp[j] == 'F') firecnt++, fire[firecnt].x = i, fire[firecnt].y = j, mp[i][j] = 0;
               }
           }
           int ans = bfs();
           if (ans == -1) printf("IMPOSSIBLE
    ");
           else printf("%d
    ", ans + 1);
       }
    }
    
  • 相关阅读:
    SpringBoot(三)——使用Thymeleaf模板
    “Usage of API documented as @since 1.8+”报错的解决办法
    JAVA的多态性
    SQL的JOIN语句
    共享锁和排他锁
    软件工程团队作业---项目选题报告
    结对作业
    PMS---团队展示
    第二次作业——个人项目实战
    第一次作业---准备
  • 原文地址:https://www.cnblogs.com/RioTian/p/12860053.html
Copyright © 2011-2022 走看看