zoukankan      html  css  js  c++  java
  • UVA11624 Fire!

    题目:

    乔在迷宫中工作。不幸的是,迷宫的一部分着火了,迷宫的主人没有制定火灾的逃跑计划。请帮助乔逃离迷宫。
    根据乔在迷宫中的位置以及迷宫的哪个方块着火,你必须确定火焰烧到他之前,乔是否可以离开迷宫,如果能离开他能跑多快。 乔和火每分钟移动一个方格,上、下、左、右,四个方向中的一个。火势向四个方向同时蔓延。
    乔可以从迷宫的任何一个边界逃离迷宫。无论是乔还是火都不会到达有墙的位置。

    输入:

    第一行输入包含一个整数,即测试次数
    每个测试用例的第一行包含两个
    整数R和C,用空格分隔,1≤R,C≤1000
    下面R行中,每一行都包含C个字符,以及每个字符是以下之一:
    # 代表墙
    . 代表空地,火和乔是可通行的
    J 乔在迷宫中最初的位置,火和乔是可通行的
    F 代表火
    在每组测试中只有一个J

    输出:

    对于每个测试用例,如果在火蔓延的时候烧到了乔,则乔无法逃出迷宫,输出'IMPOSSIBLE'如果乔能逃出迷宫,则输出乔最快可以在几分钟内安全逃出迷宫,每组输出占一行

    样例:

    分析:因为火出现位置传播方向固定,所以何时何地会被火覆盖是固定的,只要先进行预处理得到某处在几分钟后会被大火覆盖,在进行BFS时经过某点时间小于这个时间就ok了,同时如果该点不会被大火覆盖那它对应的临界时间就是INF

      1 #include<iostream>
      2 #include<sstream>
      3 #include<cstdio>
      4 #include<cstdlib>
      5 #include<string>
      6 #include<cstring>
      7 #include<algorithm>
      8 #include<functional>
      9 #include<iomanip>
     10 #include<numeric>
     11 #include<cmath>
     12 #include<queue>
     13 #include<vector>
     14 #include<set>
     15 #include<cctype>
     16 #define PI acos(-1.0)
     17 const int INF = 0x3f3f3f3f;
     18 const int NINF = -INF - 1;
     19 typedef long long ll;
     20 using namespace std;
     21 int n, m, flag;
     22 char maze[1005][1005];//迷宫
     23 typedef pair<int, int> P;
     24 int usedf[1005][1005], usedj[1005][1005];//火; 人 是否经过
     25 int d[1005][1005], tim[1005][1005];//人;火 时间
     26 int st, ed;//起点
     27 int dx[4] = {1, 0, -1, 0}, dy[4] = {0, 1, 0, -1};
     28 queue<P> fire;
     29 void ini()//预处理大火覆盖所需时间(BFS)
     30 {
     31     while (fire.size())
     32     {
     33         P rec = fire.front();
     34         fire.pop();
     35         for (int i = 0; i < 4; ++i)
     36         {
     37             int nx = rec.first + dx[i], ny = rec.second + dy[i];
     38             if (nx >= 0 && nx < n && ny >= 0 && ny < m && !usedf[nx][ny] && maze[nx][ny] != '#')
     39             {
     40                 usedf[nx][ny] = 1;
     41                 fire.push(P(nx, ny));
     42                 tim[nx][ny] = tim[rec.first][rec.second] + 1;
     43             }
     44         }
     45     }
     46 }
     47 int bfs()
     48 {
     49     queue<P> q;
     50     memset(usedj, 0, sizeof(usedj));
     51     for (int i = 0; i < n; ++i)
     52     {
     53         for (int j = 0; j < m; ++j)
     54             d[i][j] = INF;
     55     }
     56     q.push(P(st, ed));
     57     usedj[st][ed] = 1;
     58     d[st][ed] = 0;
     59     P temp;
     60     while(q.size())
     61     {
     62         temp = q.front();
     63         q.pop();
     64         if (temp.first == 0 || temp.first == n - 1 || temp.second == 0 || temp.second == m - 1)//到达边界即逃出
     65         {
     66             flag = 1;
     67             break;
     68         }
     69         for (int i = 0; i < 4; ++i)
     70         {
     71             int nx = temp.first + dx[i], ny = temp.second + dy[i];
     72             if (nx >= 0 && nx < n && ny >= 0 && ny < m && !usedj[nx][ny] && maze[nx][ny] == '.' && d[temp.first][temp.second] + 1 < tim[nx][ny])
     73             {
     74                 usedj[nx][ny] = 1;
     75                 q.push(P(nx, ny));
     76                 d[nx][ny] = d[temp.first][temp.second] + 1;
     77             }
     78         }
     79     }
     80     if (flag) return d[temp.first][temp.second] + 1;
     81     else return -1;
     82 }
     83 int main()
     84 {
     85     int T;
     86     cin >> T;
     87     while (T--)
     88     {
     89         flag = 0;
     90         cin >> n >> m;
     91         memset(usedf, 0, sizeof(usedf));//预处理的BFS函数的初始化,写在这里方便输入时给特殊位置赋值
     92         for (int i = 0; i < n; ++i)
     93         {
     94             for (int j = 0; j < m; ++j)
     95                 tim[i][j] = INF;
     96         }
     97         for (int i = 0; i < n; ++i)
     98         {
     99             for (int j = 0; j < m; ++j)
    100             {
    101                 cin >> maze[i][j];
    102                 if (maze[i][j] == 'J')  st = i, ed = j;
    103                 if (maze[i][j] == 'F')
    104                 {
    105                     usedf[i][j] = 1;
    106                     tim[i][j] = 0;
    107                     fire.push(P(i, j));
    108                 }
    109             }
    110         }
    111         ini();
    112         int ans = bfs();
    113         if (ans != -1) cout << ans << endl;
    114         else cout << "IMPOSSIBLE" << endl;
    115         while(fire.size()) fire.pop();
    116     }
    117     return 0;
    118 }
  • 相关阅读:
    简单介绍 CPU 的工作原理
    Converting a MatchCollection to string array
    Ubuntu18.04安装pycharm如何显示锁定图标到收藏夹
    MFC使用控制台
    将CString输出到控制台的方法
    Python 字符串前面加u,r,b的含义
    Converting a MatchCollection to string array
    git命令查看版本记录
    git命令查看版本记录
    SQL Server游标
  • 原文地址:https://www.cnblogs.com/veasky/p/10975520.html
Copyright © 2011-2022 走看看