首页 > 其他分享 >拯救007(升级版)

拯救007(升级版)

时间:2022-11-19 20:48:17浏览次数:37  
标签:int 50 50.0 yy xx 007 升级版 拯救 dis

很好的一道bfs题目,到达岸边可以看成是最后一步

#include<bits/stdc++.h>
using namespace std;

const int N = 1e5 + 10;
int n, dist[N], pre[N];
double d, dis;
struct node{
    double x, y;
    int pos;
    double f;
}a[N];
stack<int> sta;

//保证最小的最先搜到
bool cmp(node s1, node s2){
    return s1.f < s2.f;
}

void bfs(){
    queue<node> q;
    memset(dist, 0x3f, sizeof dist);
    //把所有的可能的第一步都给它放进来
    for(int i = 1; i <= n; i++){
        if(a[i].f > 7.5 && a[i].f <= 7.5 + d){
            q.push(a[i]);
            dist[i] = 1;
            pre[i] = -1;
        }
    }
    while(!q.empty()){
        auto t = q.front();
        q.pop();
        int xx = t.x, yy = t.y, poss = t.pos;
        //结束条件,当距离岸边的距离小于等于d时,就准备跳出循环
        if(xx > 0){
            if(yy > 0) dis = min(50.0 - xx, 50.0 - yy);
            else dis = min(50.0 + yy, 50.0 - xx);
        }
        else{
            if(yy > 0) dis = min(50 - yy, 50 + xx);
            else dis = min(50 + yy, 50 + xx);
        }
        if(dis <= d){
            if(dist[n + 1] == 0x3f3f3f3f){
                dist[n + 1] = dist[poss] + 1;
                pre[n + 1] = poss;
                break; 
            }
        }
        for(int i = 1; i <= n; i++){
            if(dist[i] == 0x3f3f3f3f && a[i].f > 7.5){
                double dst = sqrt((xx - a[i].x) * (xx - a[i].x) + (yy - a[i].y) * (yy - a[i].y));
                if(dst <= d){
                    dist[i] = dist[poss] + 1;
                    pre[i] = poss; 
                    q.push(a[i]);
                }
            }
        }
    }
}

void print(int x){
    if(pre[x] == -1){
        sta.push(x);
        return;
    }
    sta.push(x);
    print(pre[x]);
}

signed main(){
    cin >> n >> d;
    for(int i = 1; i <= n; i++){
        cin >> a[i].x >> a[i].y;
        a[i].f = sqrt(1.0 * a[i].x * a[i].x + 1.0 *a[i].y * a[i].y);
    }
    //要考虑一步跳出去的情况
    if(d >= 50){
        cout << 0 << endl;
        return 0;
    }
    //sort这一步非常妙,这样保证了第一步距离最近的点最先被搜索到
    sort(a + 1, a + 1 + n, cmp);
    for(int i = 1; i <= n; i++) a[i].pos = i;
    bfs();
    if(dist[n + 1] == 0x3f3f3f3f){
        cout <<"0" << endl;
        return 0;
    }
    cout << dist[n + 1] << endl;
    print(n + 1);
    //因为搜索的时候,多搜索了最后一步,但是实际上最后一步已经到达岸边
    //所以就不用输出最后一步位置了
    while(sta.size() > 1){
        auto t = sta.top();
        cout << a[t].x <<" " << a[t].y << endl;
        sta.pop();
    }
    return 0;
}

标签:int,50,50.0,yy,xx,007,升级版,拯救,dis
From: https://www.cnblogs.com/N-lim/p/16906958.html

相关文章

  • 100007 求半圆周长面积已知直径
    <?phpheader('Content-Type:text/html;charset=utf-8');define('ROOT',$_SERVER['DOCUMENT_ROOT']);includeROOT.'/assets/php/head.php';/***求半圆周长面积......
  • 前端007-css-position
    <!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"><title>positio</title><style>.navigator{height:100px;wi......
  • Excel2007选项卡打造(Ribbon菜单)
    打造ExcelRibbon菜单,2007版本适合最新的2021Excel。本质是XLM文件,注意,写错一个字符,Excel都不会显示您所写的菜单。还是借助工具写比较方便,参见:《RibbonX:自定义Office20......
  • opencv安装完之后运行例程:应用程序无法正常启动(0xc000007b)
    按照教程问题:按照教程:​​win10下VS2013+OpenCV2.4.9环境配置​​和​​OpenCV2.4.13+VS2013版本下的环境配置WIN10​​安装完了vs2013和opencv2.4.9之后,在执行例程时......
  • DG搭建过程中备库执行活动复制时报错RMAN-01007、RMAN-01009
    问题描述:DG搭建过程中备库执行活动复制时报错RMAN-01007、RMAN-01009,如下所示:备库参数文件如下:说明:备库参数文件检查后没问题,最终确认到是系统path的问题。因服务器上安装......
  • P4027 [NOI2007] 货币兑换
    前言打完这道题,感觉对李超线段树又有了进一步的了解。分析一个明显的性质,如果要买卷或卖卷的话,那么一定是全买全卖的,显然。设\(ans_i\)为第\(i\)天拥有的最大钱数,......
  • 【BOI2007】Ranklist Sorting
    【BOI2007】RanklistSortingDescription有一个长为\(n\)的排列\(p\)每次可以选两个位置\(i,j\),然后将\(p_i\)放到\(j\)的位置上,代价为\(i+j\)求将排列变为降序的最小......
  • AGC007
    我现在板刷AGC有两个目的。一个是为了多刷点题增加点练习量,多见点套路和题型。另一个是模拟赛搬AGC的时候不至于保龄。然后今天模拟赛三个套路题切爽了(虽然挂了不少分)。......
  • P3845 [TJOI2007]球赛
    简要题意\(T\)组数据,每一组数据给出\(n\)个数对\((a,b)\)。你需要将其分为几组,使得组单调不降。求最小组数。思路模拟赛考的题。先来介绍Dilworth定理:对于任意......
  • 拯救微信多号党的超实用工具!微信多开、防撤回补丁,微信防撤回,QQ防撤回
    今天给大家推荐一款实用小工具,废话不多说,直接放下载地址 下载地址https://www.hereitis.cn/soft/revokemsgpatcher  安装前,请确保电脑本机杀毒软件已全部关闭!!! R......