首页 > 其他分享 >P2537 [AHOI2005] 穿越磁场

P2537 [AHOI2005] 穿越磁场

时间:2024-12-06 12:23:24浏览次数:4  
标签:sy AHOI2005 int 机器人 P2537 ey 穿越 磁场 ex

P2537 [AHOI2005] 穿越磁场

好久以前就加了题单的好题
可你就是不写是吧(/‵Д′)/~ ╧╧

题目描述

探险机器人在Samuel星球上寻找一块奇特的矿石,然而此时它陷入了一片神秘的磁场区域,动弹不得。

探险空间站立刻扫描了这片区域,绘制出该区域的磁场分布平面图。这片区域中分布了N个磁场,每个磁场呈正方形,且边与坐标轴平行。

例如下图中,存在3个磁场,白点表示机器人的位置,黑点表示矿石的位置:

科学家们分析平面图,进一步发现:这些磁场为大小不一的正方形,可能相交,甚至覆盖,但是它们的边缘不会重合,顶点也不会重合。

例如下面的两种情形是不会出现的:

科学家们给探险机器人启动了磁力罩,这样它就可以在磁场中自由穿越了。

初始时,探险机器人和所有矿石都不在任何磁场的边缘。由于技术限制,在穿越过程中机器人只能够水平或垂直移动,且不能够沿着磁场的边缘行动。

由于磁力罩的能量有限,科学家们希望探险机器人穿越尽量少的磁场边缘采集到这块矿石。例如上图中,探险机器人最少需要穿越两次磁场边缘。

现在小联请你编写程序,帮助科学家们设计探险机器人的路线,统计探险机器人最少需要穿越多少次磁场边缘。

$ 1\le n \le100 ,0 \le x,y < 10000$

Solution:

只要我们发现虽然坐标很大,但是n并不大,所以我们可以将 \(x,y\) 离散化,然后对于每个离散化之后的相邻点互相之间连边权为1的边,然后找到起点和终点所在的 离散化后的点 跑一次最短路就好了

但是要注意的是,由于本题建图比较抽象,所以在连边时一点要细心且思路明确

Link:

for(int i=1;i<=n;i++)
{
    int x1=q[i].x1,y1=q[i].y1,x2=q[i].x2,y2=q[i].y2;
    // 0:up 1:down 2:left 3:right
    for(int xx=x1;xx<x2;xx++){w[xx][y1-1][3]=w[xx][y1][2]=w[xx][y2-1][3]=w[xx][y2][2]=1;}
    for(int yy=y1;yy<y2;yy++){w[x2-1][yy][1]=w[x2][yy][0]=w[x1][yy][0]=w[x1-1][yy][1]=1;}
}

Code:

#include<bits/stdc++.h>
const int N=105;
const int M=105*105*2;
const int inf=1e9;
using namespace std;
int x[M],y[M];
int dx[4]={-1,1,0,0};
int dy[4]={0,0,-1,1};
int w[N<<1][N<<1][4];
struct square{
    int x1,y1,x2,y2;
}q[N];
int n,sx,sy,ex,ey;
int dis[N<<1][N<<1],vis[N<<1][N<<1];
void init()
{
    for(int i=1;i<x[0];i++)for(int j=1;j<y[0];j++)dis[i][j]=inf;
}
struct Node{
    int x,y,val;
    bool operator <(const Node &e)const{
        return e.val<val;
    }
};
priority_queue<Node> Q;
void dijkstra()
{
    init();
    dis[sx][sy]=0;
    Q.push(Node{sx,sy,0});
    while(!Q.empty())
    {
        Node u=Q.top();Q.pop();
        if(u.x==ex&&u.y==ey)return;
        if(vis[u.x][u.y])continue;
        vis[u.x][u.y]=1;
        for(int i=0;i<4;i++)
        {
            int xx=u.x+dx[i],yy=u.y+dy[i];
            if(xx<1||x[0]<=xx)continue;
            if(yy<1||y[0]<=yy)continue;
            if(dis[xx][yy]>dis[u.x][u.y]+w[u.x][u.y][i])
            {
                dis[xx][yy]=dis[u.x][u.y]+w[u.x][u.y][i];
                Q.push(Node{xx,yy,dis[xx][yy]});
            }
        }
    }
}
void work()
{
    cin>>n;
    for(int i=1,xx,yy,dd;i<=n;i++)
    {
        scanf("%d%d%d",&xx,&yy,&dd);
        x[++x[0]]=xx,x[++x[0]]=xx+dd;
        y[++y[0]]=yy,y[++y[0]]=yy+dd;
        q[i]={xx,yy,xx+dd,yy+dd};
    }
    x[++x[0]]=inf,x[++x[0]]=-inf;
    y[++y[0]]=inf,y[++y[0]]=-inf;
    sort(x+1,x+1+x[0]);sort(y+1,y+1+y[0]);
    x[0]=unique(x+1,x+1+x[0])-(x+1);
    y[0]=unique(y+1,y+1+y[0])-(y+1);
    for(int i=1;i<=n;i++)
    {
        q[i]={
            lower_bound(x+1,x+1+x[0],q[i].x1)-(x+1)+1,
            lower_bound(y+1,y+1+y[0],q[i].y1)-(y+1)+1,
            lower_bound(x+1,x+1+x[0],q[i].x2)-(x+1)+1,
            lower_bound(y+1,y+1+y[0],q[i].y2)-(y+1)+1
        };
    }
    for(int i=1;i<=n;i++)
    {
        int x1=q[i].x1,y1=q[i].y1,x2=q[i].x2,y2=q[i].y2;
        // 0:up 1:down 2:left 3:right
        for(int xx=x1;xx<x2;xx++){w[xx][y1-1][3]=w[xx][y1][2]=w[xx][y2-1][3]=w[xx][y2][2]=1;}
        for(int yy=y1;yy<y2;yy++){w[x2-1][yy][1]=w[x2][yy][0]=w[x1][yy][0]=w[x1-1][yy][1]=1;}
    }
    cin>>sx>>sy>>ex>>ey;
    sx=lower_bound(x+1,x+1+x[0],sx)-x;ex=lower_bound(x+1,x+1+x[0],ex)-x;
    sy=lower_bound(y+1,y+1+y[0],sy)-y;ey=lower_bound(y+1,y+1+y[0],ey)-y;
    sx--,sy--,ex--,ey--;
    dijkstra();
    printf("%d\n",dis[ex][ey]);
}
int main()
{
    //freopen("P2537.in","r",stdin);freopen("P2537.out","w",stdout);
    work();
    return 0;
}

标签:sy,AHOI2005,int,机器人,P2537,ey,穿越,磁场,ex
From: https://www.cnblogs.com/LG017/p/18590497

相关文章

  • 光伏并网逆变器低电压穿越技术研究(Simulink仿真)
     ......
  • 古英语与人工智能:穿越时空的语言桥梁
    古英语与人工智能:穿越时空的语言桥梁在历史的长河中,语言不仅是沟通的工具,更是文化的载体。古英语,作为英语的古老形式,承载着丰富的历史信息和文化价值。随着人工智能技术的发展,我们得以用一种全新的方式重新连接过去与现在——通过AI技术实现古英语与现代英语之间的翻译。本文将探......
  • 《 C++ 点滴漫谈: 三 》穿越代码的迷雾:C++ 关键字的应用与未来
    摘要这篇博客深入探讨了C++语言中的所有关键字,涵盖了它们的作用、使用场景及其在编程中的重要性。从基础的控制流关键字到现代C++引入的关键字扩展,每个关键字都进行了详细解析。博客还展示了C++关键字的实际应用,帮助读者理解如何有效地运用它们来编写高效、清晰的代......
  • 《穿越火线》无法正常运行:穿越火线audiere.dll文件丢失的原因及解决办法分享
    在众多精彩刺激的网络游戏中,《穿越火线》以其紧张激烈的战斗场景和丰富多样的玩法,吸引了无数玩家的热爱。不过有玩家在准备玩游戏时却突然发现游戏无法正常运行,提示audiere.dll文件丢失,这无疑会让人感到十分困惑。别着急,下面就让我们一起来探讨穿越火线audiere.dll文件丢失......
  • FastAdmin目录穿越 CVE-2024-7928
    0x01漏洞描述:FastAdmin是一款基于ThinkPHP+Bootstrap开发的快速后台开发框架。FastAdmin基于Apache2.0开源协议发布,免费且不限制商业使用,目前被广泛应用于各大行业应用后台管理。其接口lang存在目录穿越漏洞,攻击者可通过该漏洞获取系统库敏感信息。0x02影响版本:FastAdmin......
  • 【人工智能】穿越科技迷雾:解锁人工智能、机器学习与深度学习的奥秘之旅
    文章目录前言一、人工智能1.人工智能概述a.人工智能、机器学习和深度学习b.人工智能发展必备三要素c.小案例2.人工智能发展历程a.人工智能的起源b.发展历程3.人工智能的主要分支二、机器学习1.机器学习工作流程a.什么是机器学习b.机器学习工作流程c.特征工程2.机......
  • 彻底解决穿越火线(CF)出现 mini0bject.dll 错误的方法
    在运行穿越火线(CrossFire,简称CF)时,如果遇到mini0bject.dll错误,这通常是由于DLL文件缺失、损坏或与游戏不兼容造成的。以下是一系列推荐的步骤,帮助你彻底解决这一问题:步骤一:重新安装CF彻底卸载CF,使用优化大师或类似工具清理注册表,手动删除所有CF相关文件,然后从官方渠......
  • “穿越时空的机械奇观:记里鼓车的历史与科技探秘“
    在人类文明的发展历程中,科技的创新与进步不仅仅推动了社会的进步,也为我们留下了丰富的文化遗产。记里鼓车,作为一种古老的里程计量工具,其历史地位和技术成就在科技史上具有重要的意义。本文将详细介绍记里鼓车的起源、结构原理以及其在历史上的演变过程。记里鼓车最早的文献......
  • 《庆余年》角色穿越高考:谁将笑傲现代考场?
    一、引言《庆余年》是一部以古代中国为背景的权谋小说,其角色们各具特色,聪明才智、武艺高强、忠诚耿直等特质使得他们在古代世界中游刃有余。然而,如果我们将这些角色置于现代高考的背景之下,他们将如何面对这一挑战?本文将围绕这一设想,分析《庆余年》中的角色在现代高考中的表现,......
  • 【文末附gpt升级秘笈】探索AGI之路:穿越大模型的冰与火,谱写未来技术的乐章
    探索AGI之路:穿越大模型的冰与火,谱写未来技术的乐章摘要随着人工智能技术的飞速发展,大模型成为了业界关注的焦点。然而,大模型并非万能,其背后隐藏着诸多迷思与挑战。本文基于“AGI技术50人”访谈栏目的素材,探讨了在通用人工智能(AGI)的道路上,那些勇敢的技术人和思想领袖们如何面......