zoukankan      html  css  js  c++  java
  • poj3669 Meteor Shower (宽度优先搜索)

    Description - 题目描述
    Bessie听说有场史无前例的流星雨即将来临;有谶言:陨星将落,徒留灰烬。为保生机,她誓将找寻安全之所(永避星坠之地)。目前她正在平面坐标系的原点放牧,打算在群星断其生路前转移至安全地点。

    此次共有M (1 ≤ M ≤ 50,000)颗流星来袭,流星i将在时间点Ti (0 ≤ Ti ≤ 1,000) 袭击点 (Xi, Yi) (0 ≤ Xi ≤ 300; 0 ≤ Yi ≤ 300)。每颗流星都将摧毁落点及其相邻四点的区域。

    Bessie在0时刻时处于原点,且只能行于第一象限,以平行与坐标轴每秒一个单位长度的速度奔走于未被毁坏的相邻(通常为4)点上。在某点被摧毁的刹那及其往后的时刻,她都无法进入该点。

    寻找Bessie到达安全地点所需的最短时间。

    Input - 输入

    • 第1行: 一个整数: M
    • 第2..M+1行: 第i+1行包含由空格分隔的三个整数: Xi, Yi, and Ti
      Output - 输出
    • 仅一行: Bessie寻得安全点所花费的最短时间,无解则为-1。

    Sample Input - 输入样例
    4
    0 0 2
    2 1 2
    1 1 2
    0 3 5
    Sample Output - 输出样例
    5

    AC代码:

    include

    include

    include

    include

    include

    using namespace std;
    int a[310][310]; //标记每个点的状态,刚开始初始化后上面的数字代表最早在第几秒该点就已不安全
    int M,j,plug=0,d[][2]={{0,1},{0,-1},{1,0},{-1,0},{0,0}}; //在初始化a[][]数组与每次移动的情况这两种情况时使用
    struct node {
    int x,y,t;
    }s[50005];
    struct noded {
    int x1,y1,len;
    };
    queuequ;

    void init(int x,int y,int m);
    int cmp(const node &a,const node &b);

    int bfs(){
    while(!qu.empty()){
    struct noded e=qu.front();
    qu.pop();
    for(int i=0;i<4;i++){
    int nx=e.x1+d[i][0],ny=e.y1+d[i][1];
    if(nx<0||ny<0) continue;
    if(a[nx][ny]==-1) {
    printf("%d ",e.len+1);
    return 0;
    }
    if(a[nx][ny]>e.len+1) {
    a[nx][ny]=e.len+1; //这一步很重要,没有则是超时,有的话时间可以控制在100ms左右,这一步的意义就是走过的不再重复的走
    struct noded f;
    f.x1=nx,f.y1=ny,f.len=e.len+1;
    qu.push(f);
    }

    	}
    }
    printf("-1
    ");
    

    }

    int main(){
    cin>>M;
    memset(a,-1,sizeof(a)); //初始化为-1,在输入数据之后若仍未-1,则该点为安全点
    for(int i=0;i<M;i++){
    scanf("%d%d%d",&s[i].x,&s[i].y,&s[i].t);
    init(s[i].x,s[i].y,s[i].t); //五个位置不再是绝对安全
    }
    sort(s,s+M,cmp); //对其进行排序,方便bfs一步一步执行
    struct noded e;
    e.x1=0,e.y1=0,e.len=0;
    qu.push(e);
    bfs();
    return 0;
    }
    void init(int x,int y,int m){ //初始化五个点不再绝对安全
    for(int i=0;i<5;i++){
    int nx=x+d[i][0],ny=y+d[i][1];
    if(nx>=0&&ny>=0&&nx<=300&&ny<=300){
    if(a[nx][ny]==-1) a[nx][ny]=m;
    else a[nx][ny]=min(m,a[nx][ny]);
    }
    else continue;
    }
    }
    int cmp(const node &a,const node &b){ //sort()比较函数
    return a.t<b.t;
    }


    作者:孙建钊
    出处:http://www.cnblogs.com/sunjianzhao/
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

  • 相关阅读:
    忘记 jumpserver 超级用户密码
    Linux 安装 MySQL-5.7.23
    Linux下MySQL 8.0安装配置
    H3C 端口镜像设置
    node.js+express+jade系列七:富文本编辑框的使用
    node.js+express+jade系列六:图片的上传
    node.js+express验证码的实现
    node.js定时任务:node-schedule的使用
    node.js+express+jade系列五:ajax登录
    node.js+express+jade系列四:jade嵌套的使用
  • 原文地址:https://www.cnblogs.com/sunjianzhao/p/11412156.html
Copyright © 2011-2022 走看看