zoukankan      html  css  js  c++  java
  • 【POJ

    -->Meteor Shower

    直接上中文了

    Descriptions:

    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

    题目链接:
    https://vjudge.net/problem/POJ-3669

    题目没给地图,但是自己要会做地图

    题目要求的是流星坐标(0 ≤ Xi ≤ 300; 0 ≤ Yi ≤ 300),而人的坐标只能行于第一象限,所以人可以X>300,Y>300 

    首先把流星落到(x,y)的时间全部展现在地图mp[i][j]中,然后人从(0,0)开始出发,dfs,找到没有落流星的地方即可

    AC代码:

    #include <iostream>
    #include <cstdio>
    #include <fstream>
    #include <algorithm>
    #include <cmath>
    #include <deque>
    #include <vector>
    #include <queue>
    #include <string>
    #include <cstring>
    #include <map>
    #include <stack>
    #include <set>
    #include <sstream>
    #define mod 1000000007
    #define eps 1e-6
    #define ll long long
    #define INF 0x3f3f3f3f
    #define MEM(x,y) memset(x,y,sizeof(x))
    #define Maxn 310
    using namespace std;
    struct node
    {
        int x,y,t;//坐标,时间
    };
    node now,net;
    queue<node>q;
    int m;
    int x,y,t;
    int mp[Maxn][Maxn];//存每一个坐标的时间
    int dt[][2]= {{1,0},{-1,0},{0,1},{0,-1},{0,0}};//连带即自己5个方向
    int bfs()
    {
        if(mp[0][0]==-1)//起始点没落过流星,这里安全,不用走
            return 0;
        if(mp[0][0]==0)//起始点在时间t=0时就被落过流星,没开始走就挂了
            return -1;
        now.x=0,now.y=0,now.t=0;//初始化起点
        q.push(now);
        while(!q.empty())
        {
            now=q.front();
            q.pop();
            for(int i=0;i<4;i++)//人走四个方向
            {
                net.x=now.x+dt[i][0];
                net.y=now.y+dt[i][1];
                net.t=now.t+1;
                if(net.t<0||net.y<0)//题目要求人只能行于第一象限,即x和y可以大于300
                    continue;
                if(mp[net.x][net.y]==-1)//这里没落过流星 安全 不用走了
                    return net.t;
                if(net.t>=mp[net.x][net.y])//到这里的时间>=流星落在这里的时间,不安全
                    continue;
                mp[net.x][net.y]=net.t;//到这里的时间<流星落在这里的时间,暂时安全,还要继续走
                q.push(net);
            }
        }
        return -1;
    }
    int main()
    {
        MEM(mp,-1);
        cin>>m;
        while(m--)
        {
            cin>>x>>y>>t;
            for(int i=0;i<5;i++)//mp存放每个流星落点附近点的时间最小值
            {
                int tx=x+dt[i][0];
                int ty=y+dt[i][1];
                if(tx<0||tx>300||ty<0||ty>300)//题目要求(0 ≤ Xi ≤ 300; 0 ≤ Yi ≤ 300)
                    continue;
                if(mp[tx][ty]==-1)//没落过流星
                    mp[tx][ty]=t;
                else//已经有过流星,取最小值
                    mp[tx][ty]=min(t,mp[tx][ty]);
            }
        }
        cout<<bfs()<<endl;
    }
  • 相关阅读:
    参与 Microsoft 开发者社区,发挥自己的技术价值。
    Silverlight 与HTML元素交互操作
    冯瑞涛的新浪技术微博正式上线!欢迎您的关注。
    Silverlight Object 标签属性介绍、初始化参数的设置和获取、客户端系统信息获取
    Visual Studio 2010 RC 公共下载开放,开发者可以通过下面的地址下载
    C# Socket 同步通信与异步通信 示例
    解决 Visual Studio 打开项目 “Project could not be opened because Microsoft Visual C# 2008 compiler could not be created” 报错
    Silverlight 与javaScript互操作
    Windows Mobile 6.5 设置 QQ 通过 WiFi 连接登录
    黑龙江.Net俱乐部在博客园安家了,欢迎您的加入、关注和参与我们的线下活动。
  • 原文地址:https://www.cnblogs.com/sky-stars/p/11185040.html
Copyright © 2011-2022 走看看