zoukankan      html  css  js  c++  java
  • POJ 3669 广度优先搜索

    题意:巨大流星雨即将袭来。每个流星会对击中的地方以及周围(上下左右四格)造成破坏。Bessie开始时位于(0, 0)位置,并希望逃到一处不会被袭击到的地方(在第一象限内)。已知每移动一格需要1个时间单位,被流星破坏后的地方不能再进入。给出M个流星在T时刻击中的地方(X, Y),问Bessie能否逃到安全的地方,若能输出最短时间,否则输出-1。

    分析:依旧是迷宫问题。不同的是,需要自己构建出迷宫。首先将maze的所有格初始化为INF,表示这个格子被袭击的时间为INF(即永远不会被袭击)。对于每一个流星,将其影响反映到maze上,如果破坏范围由重叠,那么格子显示的是较早的破坏时间(因为一旦破坏了就不能进入),即maze[x][y] = min(maze[x][y], T)。迷宫构建起来后,回到问题本身。求最短时间,可以用BFS做到。使用d[x]][y] 来保存移动到该格时的最小时间。而对于约束条件,就是对于下一步能否移动到该地方,要看下一个时刻该地方是否会被破坏,若不会则可以,即可d[x][y] + 1 < maze[x][y]。另外,需要特别注意的是,若有流星在0时刻袭击(0, 0)位置,则无法逃生。

    C++代码:

     1 #include <cstdio>
     2 #include <iostream>
     3 #include <queue>
     4 #include <algorithm>
     5 
     6 using namespace std;
     7 
     8 typedef pair<int, int> P;
     9 
    10 const int MAX_M = 50000;
    11 const int MAX_N = 400 + 1;
    12 const int INF = 100000000;
    13 
    14 //输入
    15 int M;
    16 int X[MAX_M], Y[MAX_M], T[MAX_M];
    17 
    18 int maze[MAX_N][MAX_N];                        //保存地图
    19 int d[MAX_N][MAX_N];                        //保存最短步数
    20 
    21 //4个方向
    22 const int dx[4] = {-1, 1, 0, 0};
    23 const int dy[4] = {0, 0, -1, 1};
    24 
    25 int bfs(){
    26     //一开始就被炸
    27     if(maze[0][0] == 0) return -1;
    28     
    29     queue<P> que;
    30     que.push(P(0, 0));
    31     d[0][0] = 0;
    32     while(!que.empty()){
    33         P p = que.front();
    34         que.pop();
    35         //已到达安全位置
    36         int x = p.first, y = p.second;
    37         if(maze[x][y] == INF) return d[x][y];
    38         //4个方向走
    39         for(int i = 0; i < 4; i ++){
    40             int nx = x + dx[i], ny = y + dy[i];
    41             //判断是否可移动,是否访问过,以及下一个时刻是否安全
    42             if(0 <= nx && 0 <= ny && d[nx][ny] == INF && d[x][y] + 1 < maze[nx][ny]){
    43                 que.push(P(nx, ny));
    44                 d[nx][ny] = d[x][y] + 1;
    45             }
    46         }
    47     }
    48     return -1;
    49 }
    50 
    51 void solve(){
    52     //初始化地图
    53     for(int i = 0; i < MAX_N; i ++)
    54         fill(maze[i], maze[i] + MAX_N, INF);
    55     //模拟轰炸场景
    56     for(int i = 0; i < M; i ++){
    57         maze[X[i]][Y[i]] = min(maze[X[i]][Y[i]], T[i]);
    58         for(int j = 0; j < 4; j ++){
    59             int nx = X[i] + dx[j], ny = Y[i] + dy[j];
    60             if(0 <= nx && 0 <= ny)
    61                 maze[nx][ny] = min(maze[nx][ny], T[i]);
    62         }
    63     }
    64     //初始化地图最小步数
    65     for(int i = 0; i < MAX_N; i ++)
    66         fill(d[i], d[i] + MAX_N, INF);
    67     //宽度优先搜索
    68     int ans = bfs();
    69     printf("%d
    ", ans);
    70 }
    71 
    72 int main(int argc, char const *argv[]){
    73 
    74     scanf("%d", &M);
    75     for(int i = 0; i < M; i ++){
    76         scanf("%d %d %d", &X[i], &Y[i], &T[i]);
    77     }
    78     solve();
    79     return 0;
    80 }
  • 相关阅读:
    Sql Server 查询一段日期内的全部礼拜天
    struts-config message-resources配置问题总结
    ImageTag小案例
    Struts1小案例问题教训总结(含中文乱码问题及解决)
    资源文件properties的存放路径
    BodyTagSupport小案例1
    客户端跳转与服务器跳转的区别
    href中使用相对路径访问上级目录的方法
    Tomcat下配置多个Project的虚拟主机
    win7 telnet命令无法开启的解决方案(不是内部命令或外部命令)
  • 原文地址:https://www.cnblogs.com/7hat/p/3595630.html
Copyright © 2011-2022 走看看