zoukankan      html  css  js  c++  java
  • UVA_11624 Fire! 【BFS】

    一、题面

    二、题意分析

    一个迷宫中,有一个人Joe和一个或多个起火点,起火点可以蔓延,人可以走动,都只能走4个方向,问人能走出去的最少步数,如果不能输出不可能。很多大佬说是两遍BFS,先一遍火,记录所有火蔓延到次位置的时间,然后再一遍BFS,让Joe去走,只要满足他到该点时,火还未蔓延至此就可以。我一开始就死磕的让火的蔓延与人走同步,但后来发现很多坑!!!后来A了,总结一下,在同步的时候其实需要控制的也是时间,只不过现在的时间是通过控制每次BFS访问的位置的个数来控制的,当Joe在某个时刻可能走的点都访问完后,那么火就蔓延一次,下一次Joe走的时候,要先判断一下,之前入队列的点是否在这一时刻还合法,然后继续访问队列中的其他点,再进行下一层的遍历。最终可得到最终结果。

    三、AC代码

      1 #include <iostream>
      2 #include <cstdio>
      3 #include <cstring>
      4 #include <queue>
      5 using namespace std;
      6 const int MAXN = 1e3;
      7 int R, C;
      8 bool Maze[MAXN+3][MAXN+3];
      9 bool visited[MAXN+3][MAXN+3];
     10 char S[MAXN+3];
     11 const int dx[] = {0, 0, 1, -1};
     12 const int dy[] = {1, -1, 0, 0};
     13 
     14 struct Point
     15 {
     16     int x, y;
     17     int step;
     18     Point(){};
     19     Point(int a, int b)
     20     {
     21         x = a, y = b;
     22     }
     23 };
     24 queue<Point> FQ;
     25 int BFS(Point J)
     26 {
     27     memset(visited, 0, sizeof(visited));
     28     queue<Point> JQ;
     29     Point tj , tf, t;
     30     int x, y, Cnt = J.step;
     31     JQ.push(J);
     32     while(!JQ.empty())
     33     {
     34         tj = JQ.front();
     35 
     36         if(tj.step > Cnt)
     37         {
     38             Cnt = tj.step;
     39             int L = FQ.size();
     40             for(int i = 0; i < L; i++)
     41             {
     42                 t = FQ.front();
     43                 FQ.pop();
     44                 for(int j = 0; j < 4; j++)
     45                 {
     46                     x = t.x + dx[j];
     47                     y = t.y + dy[j];
     48 
     49                     if(Maze[x][y] == 1 && x >= 0 && x < R && y >= 0 && y < C)
     50                     {
     51 
     52                         Maze[x][y] = 0;
     53                         FQ.push(Point(x, y));
     54                     }
     55                 }
     56             }
     57         }
     58         JQ.pop();
     59         if(Maze[tj.x][tj.y] == 0)
     60             continue;
     61         for(int i = 0; i < 4; i++)
     62         {
     63             t.x = tj.x + dx[i];
     64             t.y = tj.y + dy[i];
     65             t.step = tj.step+1;
     66             if(t.x < 0 || t.x >= R || t.y < 0 || t.y >= C)
     67             {
     68                 return t.step;
     69             }
     70             if(Maze[t.x][t.y] == 1 && visited[t.x][t.y] == 0)
     71             {
     72                 visited[t.x][t.y] = 1;
     73                 JQ.push(t);
     74             }
     75         }
     76     }
     77     return -1;
     78 }
     79 
     80 int main()
     81 {
     82     //freopen("input.txt", "r", stdin);
     83     //freopen("output.txt", "w", stdout);
     84     int T, Ans;
     85     scanf("%d", &T);
     86     int K = 0;
     87     while(T--)
     88     {
     89         K++;
     90         memset(Maze, 0, sizeof(Maze));
     91         while(!FQ.empty())
     92             FQ.pop();
     93         scanf("%d %d", &R, &C);
     94         Point J, F;
     95         for(int i = 0; i < R; i++)
     96         {
     97             scanf("%s", S);
     98             for(int j = 0; j < C; j++)
     99             {
    100                 if(S[j] == '#')
    101                     Maze[i][j] = 0;
    102                 else if(S[j] == '.')
    103                     Maze[i][j] = 1;
    104                 else if(S[j] == 'J')
    105                 {
    106                     J.x = i, J.y = j;
    107                     Maze[i][j] = 1;
    108                 }
    109                 else if(S[j] == 'F')
    110                 {
    111                     F.x = i, F.y = j;
    112                     Maze[i][j] = 0;
    113                     FQ.push(F);
    114                 }
    115             }
    116         }
    117         visited[J.x][J.y] = 1;
    118         J.step  = 0;
    119         Ans = BFS(J);
    120         if(Ans == -1)
    121         {
    122             printf("IMPOSSIBLE
    ");
    123         }
    124         else
    125             printf("%d
    ", Ans);
    126     }
    127     return 0;
    128 }
    View Code
  • 相关阅读:
    [导入]遍历表单的代码,包括遍历所有,以及遍历特定tag,如input,select lcs
    [导入]JS更改onclick事件 lcs
    [导入]SQLite 字符串长度 函数 lcs
    [导入]休眠 睡眠 区别 lcs
    【转】OpenGL鼠标点击事件
    【转】键盘按键和键盘对应代码表
    【转】vs2010快捷键;sql server 2008快捷;IE9快捷键
    【转】vc6.0移植到VS2010遇到的问题,散分给大家,虽然分不多,各位帮忙
    【转】单缓冲与双缓冲的区别
    【转】光照、材质、纹理的关系
  • 原文地址:https://www.cnblogs.com/dybala21/p/10013398.html
Copyright © 2011-2022 走看看