浙大数据结构:07-图5 Saving James Bond - Hard Version

news2024/10/9 15:59:27
这道题也是很有难度,我最开始尝试用Dijkstra来做,发现不是很好处理,用bfs还不错。
机翻:

1、条件准备 

n为鳄鱼数量,jump为跳跃距离,headjump为第一次跳跃距离,包括了岛的半径。

isalive标识该鳄鱼是否能到达对岸。

eyu数组存每个鳄鱼的坐标

visit存该鳄鱼是否访问过

lasteyu数组标识跳到该鳄鱼的上一头鳄鱼是哪条

  #include <iostream>
  #include<vector>
  #include<string.h>
  #include<algorithm>
  #include<stack>
  using namespace std;
  #define endl '\n'

int n,jump;double headjump;
int isalive[105];
pair<int,int> eyu[105];
int visit[105];
int lasteyu[105];

2、主函数

首先输入数据,headjump为跳跃距离加岛的半径。

令下标为104的鳄鱼为岛屿中心,这里我们令所有坐标都加50,当正数处理。中心就是(50,50)

dis数组是存能第一次跳到的鳄鱼。

循环输入每条鳄鱼信息,坐标都加上50然后存到eyu数组里。

如果该鳄鱼能跳到对岸,则isalive数组标记为1

判断该头鳄鱼是否能第一次跳到,能的话加到dis数组里。

这里注意,我们把鳄鱼据岛中心的距离用codis函数算出来*1000再加上鳄鱼下标i。

这样我们对该数组进行排序,就是按照离岛中心的距离来排序,因为下标的影响很小,不会影响到总体大小。

当我们要用的时候,可以对1000取模来看看是哪头鳄鱼。

注意如果能一步跳出单独判断,然后进入bfs就行了

int main()
  {
    std::ios::sync_with_stdio(false);
    cin.tie(0); cout.tie(0);
    cin>>n>>jump;vector<int> dis;
    headjump=jump+7.5;
     eyu[104].first = 50, eyu[104].second = 50;
for(int i=0;i<n;i++)
  {
    int a, b;
    cin >> a >> b;
    a += 50, b += 50;
    eyu[i].first = a, eyu[i].second = b;
    if (a <= jump || 100 - a <= jump || b <= jump || 100 - b <= jump)
      isalive[i] = 1;
    if(isjump(i,104,headjump))
     dis.push_back(codis(i,104)*1000+i);
  }
  sort(dis.begin(),dis.end());
  if(jump>=42.5)
    {
      cout<<'1';return 0;
    }
   bfs(dis);
    return 0;
  }

3、codis函数

算两头鳄鱼之间的距离并返回,abs是取绝对值函数

int codis(int a,int b)
{
  int x = abs(eyu[a].first - eyu[b].first);
  int y = abs(eyu[a].second - eyu[b].second);
  return x*x+y*y;
}

4、isjump函数

判断两头鳄鱼之间距离是否为dis

bool isjump(int a, int b, double dis)
{
  if ((double)codis(a,b) <= dis * dis)return 1;
  return 0;
}

5、bfs函数

代码比较长,我们一点点看。

minjump是存跳的鳄鱼的最少数量,answer栈是存最短路上鳄鱼下标的。

循环遍历dis数组,表示从该头鳄鱼开始跳到岸边的最短路

初始化每一头鳄鱼的上一头鳄鱼为-1,visit数组置0

cur存当前为第几头鳄鱼开始跳,对1000取模即可。

然后用数组模拟队列,tt指队尾,hh指队头

把cur放进队列中,visit置1

layer表示第几步跳到当前鳄鱼,初始为第一步(即cur)

last标记上一步的最后一头鳄鱼,初始为cur因为第一步只能为cur。

遍历队列直到为空,用now取出当前队头是第几头鳄鱼,然后循环判断它能不能跳到其它鳄鱼并且该鳄鱼没有被跳到过,有的话加入队列visit置1,然后该头鳄鱼的上一头鳄鱼为now

如果当前鳄鱼能跳到岸边,并且最短路小于mindist,则更新答案,mindist为layer,answer清空把该最短路上的鳄鱼加进来,即遍历lasteyu数组,直到该鳄鱼没有上一头鳄鱼(为-1),跳出循环。

如果不能跳到岸边,则看看是否更新步数,即当前鳄鱼为上一步所能到达的所有鳄鱼中放入队列的最后一头,更新layer,last更新为队尾。

最后遍历完输出答案,如果mindist没更新输出0,

否则输出步数(鳄鱼头数+1),然后弹出栈里的鳄鱼并输出,此时顺序刚好是对的。

void bfs(vector<int>&dis)
{
  int minjump=1000; 
  stack<int> answer;
 //存答案
    for(int i=0;i<dis.size();i++)
  {
    memset(lasteyu,-1,sizeof(lasteyu));
    memset(visit,0,sizeof(visit));
    int cur=dis[i]%1000;
    int q[105];int tt=-1,hh=0;
    visit[cur]=1;q[++tt]=cur;
    int last=cur;
    int layer=1;
//从每一个能第一步跳到的鳄鱼开始跳然后判断
    while(hh<=tt)
    {
      int now=q[hh++];
//把能跳到的鳄鱼加进队列
       for(int j=0;j<n;j++)
       {
        if(!visit[j]&&isjump(now,j,jump))
        {
         visit[j]=1;
         q[++tt]=j;
         lasteyu[j]=now;
        }
       }
//如果跳到该鳄鱼了,并且距离短就更新答案
      if(isalive[now]&&layer<minjump)
      {
        minjump=layer;
        answer=stack<int>();
        for(;now!=-1;now=lasteyu[now])
          answer.push(now);
         break;
      }
//更新层数,也就是跳的次数
      if(now==last)
      {
        last=q[tt];
        layer++;
      } 
    }
  }
//输出答案
  if(minjump!=1000)
  {
    cout<<minjump+1<<endl;
    while(answer.size())
    {
      int cur=answer.top();
      cout<<eyu[cur].first-50<<' '<<eyu[cur].second-50<<endl;
      answer.pop();
    }
  }
   else cout<<'0';
} 

6、总结

这道题难度比较大,主要很多细节不好处理,比较耗时。

完整代码如下:

  #include <iostream>
  #include<vector>
  #include<string.h>
  #include<algorithm>
  #include<stack>
  using namespace std;
  #define endl '\n'

int n,jump;double headjump;
int isalive[105];
pair<int,int> eyu[105];
int visit[105];
int lasteyu[105];

int codis(int a,int b)
{
  int x = abs(eyu[a].first - eyu[b].first);
  int y = abs(eyu[a].second - eyu[b].second);
  return x*x+y*y;
}

bool isjump(int a, int b, double dis)
{
  if ((double)codis(a,b) <= dis * dis)return 1;
  return 0;
}

void bfs(vector<int>&dis)
{
  int minjump=1000; 
  stack<int> answer;
 
    for(int i=0;i<dis.size();i++)
  {
    memset(lasteyu,-1,sizeof(lasteyu));
    memset(visit,0,sizeof(visit));
    int cur=dis[i]%1000;
    int q[105];int tt=-1,hh=0;
    visit[cur]=1;q[++tt]=cur;
    int last=cur;
    int layer=1;

    while(hh<=tt)
    {
      int now=q[hh++];
       for(int j=0;j<n;j++)
       {
        if(!visit[j]&&isjump(now,j,jump))
        {
         visit[j]=1;
         q[++tt]=j;
         lasteyu[j]=now;
        }
       }
      if(isalive[now]&&layer<minjump)
      {
        minjump=layer;
        answer=stack<int>();
        for(;now!=-1;now=lasteyu[now])
          answer.push(now);
         break;
      }
      if(now==last)
      {
        last=q[tt];
        layer++;
      } 
    }
  }

  if(minjump!=1000)
  {
    cout<<minjump+1<<endl;
    while(answer.size())
    {
      int cur=answer.top();
      cout<<eyu[cur].first-50<<' '<<eyu[cur].second-50<<endl;
      answer.pop();
    }
  }
   else cout<<'0';
} 

  int main()
  {
    std::ios::sync_with_stdio(false);
    cin.tie(0); cout.tie(0);
    cin>>n>>jump;vector<int> dis;
    headjump=jump+7.5;
     eyu[104].first = 50, eyu[104].second = 50;
for(int i=0;i<n;i++)
  {
    int a, b;
    cin >> a >> b;
    a += 50, b += 50;
    eyu[i].first = a, eyu[i].second = b;
    if (a <= jump || 100 - a <= jump || b <= jump || 100 - b <= jump)
      isalive[i] = 1;
    if(isjump(i,104,headjump))
     dis.push_back(codis(i,104)*1000+i);
  }
  sort(dis.begin(),dis.end());
  if(jump>=42.5)
    {
      cout<<'1';return 0;
    }
   bfs(dis);
    return 0;
  }

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2199430.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

求职书与求职经历 - Chap01.

节前定点在智联投了几家&#xff0c;智联上之前的简历还在&#xff0c;稍稍维护了一下&#xff0c;现在有两三家再看看。然后节后&#xff0c;今天&#xff0c;注册了职友网的7天会员。正在整理简历。 专利证书&#xff0c;通过soopat查&#xff0c;很不友好。国家产权局后来直…

docker部署langfuse 本地

下载langfuse地址:https://api.github.com/repos/langfuse/langfuse/tarball/v2.43.2 tips&#xff1a;这里有的博主说需要clone到本地&#xff0c;但是我的docker clone langfuse到本地使用docker安装页面提示如下错误: 最后使用下载地址 上传到服务器后 解压再安装 反正没有…

PIFA天线工作原理:【图文讲解】

1&#xff1a;什么是PIFA天线 PIFA ( Planar Inverted F-shaped Antenna)天线即平面倒F形天线&#xff0c;因为整个天线的形状像个倒写的英文字母F而得名 2&#xff1a;PIFA天线的应用 PIFA常见于手机天线设计&#xff0c;占手机内置天线的60%-80% 3&#xff1a;PIFA天线结构…

5.错误处理在存储过程中的重要性(5/10)

错误处理在存储过程中的重要性 引言 在数据库编程中&#xff0c;存储过程是一种重要的组件&#xff0c;它允许用户将一系列SQL语句封装成一个单元&#xff0c;以便重用和简化数据库操作。然而&#xff0c;像任何编程任务一样&#xff0c;存储过程中的代码可能会遇到错误或异常…

封装vue-cropper,图片裁剪组件

组件基本使用: 这里的action同时也可以传相对路径&#xff0c;比如封装了axios&#xff0c;那么组件源码里就不需要引入原生axios&#xff0c;可以替换为封装的axios。传 action"/upload/file" 源代码&#xff1a; <script setup> import WuyuCropper from /c…

PyTorch单机多卡训练(无废话)

目前大家基本都在使用DistributedDataParallel&#xff08;简称DDP&#xff09;用来训练&#xff0c;该方法主要用于分布式训练&#xff0c;但也可以用在单机多卡。 第一步&#xff1a;初始化分布式环境&#xff0c;主要用来帮助进程间通信 torch.distributed.init_process_g…

Notepad-- 程序员日常用法

一、快速查找标记&#xff0c;提取指定的字符串 1.使用正则表达式查找并标记&#xff0c;将标记的内容复制到新文本中 标记中输入&#xff1a;.*"staffNo": "([^"])".* 这个正则表达式可以匹配整个行&#xff0c;并将 staffNo 后面的内容标记出来。…

修复WordPress .htaccess文件中的常见问题

在搭建WordPress网站时&#xff0c;.htaccess文件非常重要。它可以帮助我们管理网站的重定向、优化URL结构、提高网站安全性等。然而&#xff0c;有时可能会出现由.htaccess文件引起的问题&#xff0c;比如500内部服务器错误、重定向次数过多和文章返回404错误等。本文将详细介…

Hadoop---概念篇

一、Hadoop的组成 二、HDFS架构概述 **1.NameNode(nn): **存储文件的元数据,例如:文件名、文件目录结构、文件属性(生成时间、副本数、文件权限)以及每个文件的块列表和块所在的DateNode等。 **2.DateNode(dn): **在本地文件系统中存储的文件块数据,以及块数据的校验和。 **3.…

后端必备技巧之SQL优化

日常开发中&#xff0c;几乎都免不了和数据库打交道&#xff0c;说到数据库&#xff0c;我们也需要联想这几个问题&#xff1a;我们写的SQL性能怎么样&#xff1f;有没有优化的空间&#xff1f;如何优化&#xff1f;下面我们来介绍关于SQL性能的命令EXPLAIN 什么是EXPLAIN命令&…

智融SW3536DC/DC+快充协议二合一IC

描述 SW3536 是一款高集成度的多快充协议双口充电芯片&#xff0c;支持 AC 口任意口快充输出&#xff0c;支持双口独立限流。其集成了 7A 高效率同步降压变换器&#xff0c;支持 PPS/ PD/ QC/ AFC/ FCP/ SCP/ PE/ SFCP/TFCP 等多种快充协议&#xff0c;支持 140W 输出功率&…

SGDC复位约束找不到信号问题

在使用spyglass编写sgdc时&#xff0c;对一个内部复位信号约束的时候&#xff0c;报信号找不到。 reset -name TOP.BLOCK3.U_TOP2.BLOCK1.U_TOP1.rst -value 0 但是明明get_pins 可以找到此信号。 由于存在generate命令&#xff0c;导致生成的路径比较奇怪&#xff0c;甚至存…

.NET 一款提权工具:Sharp4PetitPotato

01阅读须知 此文所提供的信息只为网络安全人员对自己所负责的网站、服务器等&#xff08;包括但不限于&#xff09;进行检测或维护参考&#xff0c;未经授权请勿利用文章中的技术资料对任何计算机系统进行入侵操作。利用此文所提供的信息而造成的直接或间接后果和损失&#xf…

深入浅出MongoDB(六)

深入浅出MongoDB&#xff08;六&#xff09; 文章目录 深入浅出MongoDB&#xff08;六&#xff09;分析查询性能原子性和事务字段名称带句点和美元符号查询计划 分析查询性能 mongodb compass提供解释计划标签页&#xff0c;其中显示有关查询性能的统计信息。这些统计信息可用…

简历修订与求职经历 - Chap02.

最新的简历&#xff1a; 1.基本信息 姓名 ---- 学历 学位 本科 理学学士 专业 应用物理 智能仪器仪表 性别 男 出生年月 1976/7 电话 ---- 年龄 48 毕业时间 1998/6 电邮 ---- 籍贯 河南洛阳宜阳 居住地 河南郑州高新区 1.1 期望从事职业信息 机械仪器…

泡沫背后:人工智能的虚幻与现实

人工智能的盛世与泡沫 现今&#xff0c;人工智能热潮席卷科技行业&#xff0c;投资者、创业者和用户都被其光环吸引。然而&#xff0c;深入探讨这种现象&#xff0c;人工智能的泡沫正在形成&#xff0c;乃至具备崩溃的潜质。我们看到的&#xff0c;无非是一场由资本推动的狂欢…

双11大促最值得入手的好物是哪些?双11好物种草清单大全分享!

在这个全民狂欢的购物盛宴中&#xff0c;每个人都希望能以最优惠的价格买到心仪已久的好物&#xff0c;随着科技的飞速发展和生活品质的提升&#xff0c;市场上的产品琳琅满目&#xff0c;让人目不暇接&#xff0c;为了帮助大家在这个双11找到真正值得入手的好物&#xff0c;我…

chatGPT模型接口分享

前言: 仅供学习和交流&#xff0c;请合理使用。 API&#xff1a;https://api.gptnet.org key&#xff1a;sk-x9Rmq3HeHh5z9EIi8wFaXCl02OfxRSk5UAFodYm1o4zo5X3i 支持模型&#xff1a;gpt-3.5-turbo、gpt-3.5-turbo-16k、gpt-4o-mini、llama-3.1-405b 暂时支持以上四个模型…

一键生成PPT在线使用的保姆级教程:告别加班就靠它

已经过完24年所有的法定节假日的你&#xff0c;上班状态还好吗&#xff1f; 小编人倒是挺飘忽的&#xff0c;就那种人在工位&#xff0c;魂仍在青青大草原的感觉&#xff0c;都是牛马却失去了自由奔跑的权利...... 尤其是还要面对节前一堆没完成的工作&#xff0c;手动完成不…

基于Jenkins+K8S构建DevOps自动化运维管理平台

目录 1.k8s助力DevOps在企业落地实践 1.1 传统方式部署项目为什么发布慢&#xff0c;效率低&#xff1f; 1.2 上线一个功能&#xff0c;有多少时间被浪费了&#xff1f; 1.3 如何解决发布慢&#xff0c;效率低的问题呢&#xff1f; 1.5 什么是DevOps&#xff1f; 1.5.1 敏…