当前位置: 首页 > news >正文

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

这道题也是很有难度,我最开始尝试用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;}

相关文章:

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

这道题也是很有难度&#xff0c;我最开始尝试用Dijkstra来做&#xff0c;发现不是很好处理&#xff0c;用bfs还不错。 机翻&#xff1a; 1、条件准备 n为鳄鱼数量&#xff0c;jump为跳跃距离&#xff0c;headjump为第一次跳跃距离&#xff0c;包括了岛的半径。 isalive标识…...

【Verilog学习日常】—牛客网刷题—Verilog企业真题—VL69

脉冲同步器&#xff08;快到慢&#xff09; 描述 sig_a 是 clka&#xff08;300M&#xff09;时钟域的一个单时钟脉冲信号&#xff08;高电平持续一个时钟clka周期&#xff09;&#xff0c;请设计脉冲同步电路&#xff0c;将sig_a信号同步到时钟域 clkb&#xff08;100M&…...

电商商品数据采集||高并发||多语言请求实例演示|京东|淘宝商品详情数据SKU价格

以京东商品数据采集为例 京东商品详情接口数据采集是指通过调用京东提供的商品详情API接口&#xff0c;获取商品的详细信息。以下是一个简单的步骤来实现这个功能&#xff1a; 1. 注册京东开发者账号 首先&#xff0c;你需要注册一个京东开发者账号&#xff0c;并创建一个应…...

云手机哪款好用?2024年云手机推荐对比指南

随着云手机市场的快速扩展&#xff0c;消费者在选择云手机时面临着众多选择。为了帮助大家找到最适合自己的云手机&#xff0c;小编特意整理了一份当前市场上几款备受关注的云手机品牌对比&#xff0c;大家一起往下看吧。 1. Ogphone云手机 Ogphone云手机是近年来海外业务版块迅…...

无人机航测内业常用建模软件手册下载(上)

航测项目外业离不开无人机&#xff0c;内业离不开制图软件。 无人机航测外业作业包括控点布设、航线规划、仿地飞行、航拍等流程&#xff0c;而内业数据处理则常涉及到CC、Pix4D、PhotoScan、大疆智图、重建大师、M3D、瞰景Smart3D、天工等软件。 我们整理了这些常用建模软件…...

Python Django ORM 的工作原理

在 Web 开发中&#xff0c;处理数据库是非常常见的需求&#xff0c;尤其是在构建动态应用程序时。Django 作为一个流行的 Python Web 框架&#xff0c;提供了一套强大的工具帮助开发者轻松管理数据库。Django 的 ORM&#xff08;对象关系映射&#xff0c;Object-Relational Map…...

GoLang编程常用规范/工具

代码格式化工具 代码风格&#xff1a; go install github.com/fsgo/go_fmt/cmd/gorgeouslatest gorgeous # 仅格式化git有改动的文件。如需格式化所有文件&#xff0c;可以执行 gorgeous ./...标签格式&#xff1a;https://github.com/4meepo/tagalign go install github.c…...

数字王国里的虚拟人――技术、商业与法律解读

&#x1f482; 个人网站:【 摸鱼游戏】【神级代码资源网站】【海拥导航】&#x1f91f; 找工作&#xff0c;来万码优才&#xff1a;&#x1f449; #小程序://万码优才/HDQZJEQiCJb9cFi&#x1f485; 想寻找共同学习交流&#xff0c;摸鱼划水的小伙伴&#xff0c;请点击【全栈技…...

Java后端基础练习|请求参数

请求参数&#xff0c;可以通过四种方式传递到后端 请求路径查询参数请求体请求头 controller代码 package com.urfread.breaknews.core.controller;import com.urfread.breaknews.core.common.model.ResultData; import lombok.Data; import org.springframework.web.bind.a…...

C# + SQLiteExpert 进行(cipher)加密数据库开发+Costura.Fody 清爽发布

一&#xff1a;让 SQLiteExpert 支持&#xff08;cipher&#xff09;加密数据库 SQLiteExpert 作为SQlite 的管理工具&#xff0c;默认不支持加密数据库的&#xff0c;使其成为支持&#xff08;cipher&#xff09;加密数据库的管理工具&#xff0c;需要添加e_sqlcipher.dll &…...

MySQL 8.0 新特性之自增变量持久化

MySQL 8.0 新特性之自增变量持久化 文章目录 MySQL 8.0 新特性之自增变量持久化MySQL 5.7 vs 8.0 测试对比MySQL 5.7MySQL 8.0 参考资料 MySQL 8.0 中支持自增变量持久化&#xff0c;实际也是解决之前版本中存在的自增主键重启重置的 BUG 问题&#xff08; BUG #199&#xff1…...

网站建设公司哪家好?好的网站建设公司应该有哪些特别之处?

面对众多的网站建设公司&#xff0c;企业该如何选择呢&#xff1f;如何才能避坑呢&#xff1f;本文将探讨好的网站建设公司应该具备的特别之处 案例&#xff0c;这是最直观的表现&#xff0c;一个好的网站建设公司必然拥有为数众多的的案例展示&#xff0c;且这些案例质量高&a…...

香山南湖架构分析--FE

总体架构 分支预测和指令缓存&#xff0c;通过FTQ达到解耦的目的&#xff1b;FTQ将请求送给ICache,进行取指&#xff1b;取出的指令码通过预译码初步检查分支预测的错误并及时冲刷预测流水线&#xff1b;检查后的指令送入指令缓冲并传给译码模块&#xff0c;最终形成后端的指令…...

【Linux的那些事】shell命名及Linux权限的理解

目录 一、shell命令以及运行原理 二、Linux权限的概念 三、Linux权限管理 3.1.文件访问者的分类&#xff08;人&#xff09; 3.2.文件类型和访问权限&#xff08;事物属性&#xff09; 3.3.文件权限值的表示方法 3.4.文件访问权限的相关设置方法 a)chmod b)chown c)…...

Visual Studio 2022 配置 Boost 库

一、使用预编译版本 尽量不要使用预编译版本&#xff0c;因为可能构建的不完全&#xff0c;还得重新构建&#xff0c;不如一步到位 1. 下载预编译的 Boost 库 下载&#xff1a;Boost C Libraries - Browse /boost-binaries at SourceForge.net 2. 选择 msvc 版本&#xff0…...

逻辑回归(下): Sigmoid 函数的发展历史

背景 闲来无事翻了一下之前买的一个机器学习课程及之前记录的网络笔记&#xff0c;发现遇到公式都是截图&#xff0c;甚至是在纸上用笔推导的。重新整理一遍之前逻辑回归函数的学习笔记&#xff0c;主要是为了玩一下 LaTex 语法&#xff0c;写公式挺有意思的。 整理之前三篇笔…...

快速理解mQ(三)——RabbitMQ 各种交换机的区别与应用

RabbitMQ是一个开源的消息代理软件&#xff0c;它实现了高级消息队列协议&#xff08;AMQP&#xff09;&#xff0c;允许应用程序或系统以异步的方式交换数据。RabbitMQ中的交换机&#xff08;Exchange&#xff09;是消息的分发中心&#xff0c;它接收来自生产者的消息&#xf…...

【五分钟学会】YOLO11 自定义数据集从训练到部署

数据集地址 数据集包含 360 张红血细胞图像及其注释文件&#xff0c;分为训练集与验证集。训练文件夹包含 300 张带有注释的图像。测试和验证文件夹都包含 60 张带有注释的图像。我们对原始数据集进行了一些修改以准备此 CBC 数据集&#xff0c;并将数据集分成三部分。在360张…...

Redis学习(十二)连接数不足报错及分析修复:ERR max number of clients reached.

目录 一、问题介绍二、问题分析2.1 redis-cli 登录2.2 info clients 查看连接数情况2.3 client list 查看具体连接情况2.4 分析连接空闲时长2.5 client list 根据客户端IP统计连接数 三、问题结论和解决3.1 问题结论&#xff1a;3.2 解决方案①&#xff1a;优化程序3.3 解决方案…...

八股文面试题总结(包含主流的面试经典题)

Java基础 1、JDK和JRE的区别是什么** JDK是Java开发工具包&#xff0c;JRE是Java运行时环境&#xff0c;二者的区别在于 JRE是Java程序运行所必须的&#xff0c;它包含jvm和一些Java的基础类库 JDK是Java程序开发所必须的&#xff0c;它包含JRE和一些开发工具 总结一下就是…...

一分钟掌握 Java22 新特性

1. 增强的模式匹配&#xff08;Pattern Matching for Switch&#xff09; Java 22 扩展了模式匹配的功能&#xff0c;允许在 switch 语句中使用模式匹配&#xff0c;从而使代码更加简洁和易读。 示例代码&#xff1a; public class PatternMatchingSwitchDemo {public stati…...

西安凭借入驻企业展示科技“硬”实力的数字媒体产业园

在古城西安的怀抱中&#xff0c;一座以科技“硬”实力为核心竞争力的数字媒体产业园——西安国际数字影像产业园&#xff0c;正以其独特的魅力和无限的潜力&#xff0c;吸引着全球的目光。这里&#xff0c;不仅是数字创意的孵化场&#xff0c;更是科技创新的策源地。 西安国际数…...

【网络安全】利用XSS、OAuth配置错误实现token窃取及账户接管 (ATO)

未经许可,不得转载。 文章目录 正文正文 目标:target.com 在子域sub1.target.com上,我发现了一个XSS漏洞。由于针对该子域的漏洞悬赏较低,我希望通过此漏洞将攻击升级至app.target.com,因为该子域的悬赏更高。 分析认证机制后,我发现: sub1.target.com:使用基于Cook…...

浙江所有省级医院体检报告查询上线浙里办!

在医院完成体检后不知道什么时候出报告 体检报告出来后又要跑一次医院去拿报告 历年体检报告没保管好 往年体检报告找不到了 ………… ​编辑 为解决这些问题&#xff0c;浙江省卫生健康委结合“两卡融合、一网通办”工作的推进&#xff0c;不断丰富电子健康医保卡的功能&#…...

支付宝支付Java+uniapp支付宝小程序

JS&#xff1a; request.post(/vip/pay, {//这是自己写的java支付接口id: this.vipInfo.id,payWay: alipay-mini}).then((res) > {let success (res2) > {//前端的支付成功回调函数this.$refs.popup.close();// 支付成功刷新当前页面setTimeout(() > {this.doGetVipI…...

Linux-磁盘优化的几个思路

优化前先看看性能指标 I/O 基准测试 fio&#xff08;Flexible I/O Tester&#xff09;正是最常用的文件系统和磁盘 I/O 性能基准测试工具。这类工具非常用&#xff0c;了解即可 应用程序优化 应用程序处于整个 I/O 栈的最上端&#xff0c;它可以通过系统调用&#xff0c;来调…...

【第三版 系统集成项目管理工程师】第15章 组织保障

持续更新。。。。。。。。。。。。。。。 【第三版】第十五章 组织保障 15.1信息和文档管理15.1.1 信息和文档1.信息系统信息-P5462.信息系统文档-P546 15.1.2 信息(文档)管理规则和方法1.信息(文档)编制规范-P5472.信息(文档)定级保护-P5483.信息(文档)配置管理-P549练习 15.…...

从编程视角看生命、爱、自由、生活的排列顺序

从编程视角看生命、爱、自由、生活的排列顺序 离开大学校园&#xff0c;踏入大厂成为一名算法工程师后&#xff0c;我常以编程思维看待生活中的事物。在思考生命、爱、自由和生活的排列顺序时&#xff0c;发现从编程角度分析这些概念会有独特见解。 一、生命——程序的核心代…...

Lumerical——属性编辑窗口的详解

一、几何选项卡(Geometry tab) 通过几何选项卡中的选项可以设定物件的位置和大小。 二、材料选项卡(Material tab) ① 材料(MATERIAL): 在该字段可以设置成材料数据库中包含的任何材料。数据库也有可能包含一些新材料,也可以对已经包含的材料进行编辑。如果选…...

08实战篇:972应用题(2024)思路解析

在本节中,你将学习到: 2024年972应用题的基本解题思路如何应对陌生的社会/学术热点问题,避免初见杀题目一:阐述搜索引擎的工作基本原理 关键词:搜索引擎、基本原理题型:基础概念题这是一道混在应用题中的简答题。根据《信息检索》一书中的P37内容回答即可(同时对应P45—…...