蓝桥杯算法题:练功

【问题描述】
小明每天都要练功,练功中的重要一项是梅花桩。
小明练功的梅花桩排列成 n 行 m 列,相邻两行的距离为 1,相邻两列的距离也为 1。
小明站在第 1 行第 1 列上,他要走到第 n 行第 m 列上。小明已经练了一段时间,他现在可以一步移动不超过 d 的距离(直线距离)。
小明想知道,在不掉下梅花桩的情况下,自己最少要多少步可以移动到目标。
【输入格式】
输入的第一行包含两个整数 n, m,分别表示梅花桩的行数和列数。
第二行包含一个实数 d(最多包含一位小数),表示小明一步可以移动的距离。
【输出格式】
输出一个整数,表示小明最少多少步可以到达目标。
【样例输入】
3 4
1.5
【样例输出】
3
【评测用例规模与约定】
对于 30% 的评测用例,2 <= n, m <= 20,1 <= d <= 20。
对于 60% 的评测用例,2 <= n, m <= 100,1 <= d <= 100。
对于所有评测用例,2 <= n, m <= 1000,1 <= d <= 100。

思路:根据题意可以采用广度优先搜索,将遍历过的点加入到一个队列,队列中的点距原点(1,1)的距离从小到大,每次从队首中取出结点进行拓展,直至拓展至终点。

要解决的问题:

①如何判断到达每个点的最小步数:用一个二维数组vis存储,vis[i][j]表示(1,1)到(i

,j)的最小步数,从(i,j)拓展出点(s,t),则令vis[s][t]=vis[i][j]+1,也就是步数加1

②如何拓展周围的点:读懂题目的值,只要我一步的距离小于d,我去哪都行,直着走也行,斜着走也行,就像是以点(i,j)为圆心,做半径为d的圆,圆里边的点我都可以拓展。那怎么判断哪些点在圆内呢?可以用两层for循环来遍历,然后判断那些点与圆心的距离是否小于d,来判断是否在圆内。不过这样时间复杂度就有点大了,可以贪心一下,如下图:

那怎么找一水平线最大能像右边拓展的点呢?用二分(从一堆与圆形距离小于等于d的点中找最大那个)

③通过上述思路,可以写出来代码,但是还是有一个测试点显示时间超时,那怎么优化呢?

可以想到,我们用一个点拓展出的其他点,步数都是一样的,那我只取距离终点(n,m)最近的那个放入队列再进行拓展不就好了

好了,问题应该就这些了,ac代码如下:

#include<bits/stdc++.h>
using namespace std;
int vis[1010][1010];
int n,m;
double d;
struct Point {int x,y;
};
double dis(int x1,int y1,int x2,int y2) {return sqrt(pow(x1-x2,2)+pow(y1-y2,2));
}
int bfs() {queue<Point>q;q.push({1,1});vis[1][1]=1;while(!q.empty()) {Point p=q.front();q.pop();if(d-dis(n,m,p.x,p.y)>-1e-6)return vis[p.x][p.y];//不用到终点,我只需要知道在某个点能不能一步到终点即可,如果能到,我直接得出结果,为什么这里不用加1,因为我的步数是从1开始的,所以自然多了一个1int x1=1,y1=1;double minDis=0x3f3f3f3f;for(int i=p.x; i<=min(p.x+d,n*1.0); i++) {//二分找y的最大值int mid;int l=p.y,r=min(m*1.0,p.y+d);while(l<r) {mid=(l+r+1)/2;if(d-dis(p.x,p.y,i,mid)>-1e-6)l=mid;else r=mid-1;}if(!vis[i][l]&&minDis>dis(i,l,n,m)) {x1=i,y1=l,minDis=dis(i,l,n,m);}}if(!vis[x1][y1]){//只拓展离终点最近的那个q.push({x1,y1});vis[x1][y1]=vis[p.x][p.y]+1;}}return -1;
}
int main() {cin>>n>>m;cin>>d;cout<<bfs()<<endl;
}

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

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

相关文章

gcc/g++:编译阶段翻译成平台汇编代码

编译阶段翻译成平台汇编代码&#xff0c;是在预编译阶段上加码&#xff0c;将C/C代码翻译成平台相关的汇编代码。 示例&#xff1a; 1&#xff09;用户程序 /*brief test demo-for-compile-to-asm? show you hereauthor wenxuanpeiemail 15873152445163.com(query for any q…

OpenHarmony实战:瑞芯微RK3566移植案例(下)

OpenHarmony实战&#xff1a;瑞芯微RK3566移植案例&#xff08;下&#xff09; OpenHarmony实战&#xff1a;瑞芯微RK3566移植案例&#xff08;中&#xff09; WIFI 整改思路及实现流程 整改思路 接下来熟悉HCS文件的格式以及"HDF WIFI”核心驱动框架的代码启动初始化…

大话设计模式——11.桥接模式(Bridge Pattern)

简介 将抽象部分与它的实现部分分离&#xff0c;使它们可以独立变化。 UML图&#xff1a; 应用场景&#xff1a; 系统需要在构建的抽象化角色和具体化角色之间增加更多的灵活性不想使用继承导致系统类的个数急剧增加某个类存在多个变化维度使用继承方式容易出现类的膨胀 示例…

Windows编译运行TensorRT-YOLOv9 (C++)

Windows编译运行yolov9-bytetrack-tensorrt&#xff08;C&#xff09; 1 基础环境2 编译yolov9-bytetrack-tensorrt&#xff08;1&#xff09;下载yolov9-bytetrack-tensorrt源码&#xff08;2&#xff09;修改CMakeLists.txt&#xff08;3&#xff09;CMake编译 3 yolov9模型转…

js怎样控制浏览器前进、后退、页面跳转

window.open(")&#xff1b;--这种方法可以打开新的标签页并在新标签页跳转到页面。 window.open(页面链接) window.location.href"&#xff1b;-这种方法可以直接改变当前页面的地址&#xff0c;不打开新的标签页。 window.location.href页面链接 window…

python+appium调@pytest.mark.parametrize返回missing 1 required positional argument:

出错描述&#xff1a; 1、在做pythonappium自动化测试时&#xff0c;使用装饰器pytest.mark.parametrize&#xff08;“参数”&#xff0c;[值1&#xff0c;值2&#xff0c;值3]&#xff09;&#xff0c;测试脚本执行返回test_xx() missing 1 required positional argument:“…

富格林:谨记合理阻挠虚假方案

富格林悉知&#xff0c;现货黄金作为良好的避险投资产品&#xff0c;受到越来越多人的欢迎。但是对于新手投资者来说&#xff0c;在进行真实交易之前一定要掌握交易的操作技巧&#xff0c;因为缺乏技巧的支撑会让我们难以阻挠虚假操作。在现货黄金市场中&#xff0c;只要稍有不…

【数据结构与算法】:归并排序和计数排序

1. 归并排序 归并排序是一种效率仅次于快速排序的排序算法。它有非递归和递归两种实现方式(本文只讲述递归实现&#xff0c;非递归实现以后有专门的文章)。 其实&#xff0c;归并排序也叫外排序。它不仅可以对内存中的数据进行排序&#xff0c;还能对文件里的数据排序。 比如&…

革新铁路安全管理,RFID电子锁技术提升效率与防护

一、铁路行业的现状与挑战 铁路行业作为全球重要的交通基础设施&#xff0c;承担着庞大的客运和货运任务。随着铁路网络的不断扩张&#xff0c;如何确保铁路资产的安全、提高运营效率、降低维护成本&#xff0c;成为行业面临的主要挑战。传统的铁路资产管理依赖于人工巡检和记…

colmap安装问题汇总

问题目录 问题0、没有root权限怎么安装colmap&#xff1f; 问题1、ERROR: SiftGPU not fully supported/Could not connect to any X display 问题2、Cannot specify include directories for imported target "freeimage::FreeImage". 问题3、could not find ZL4 问…

【GEE】遥感数据趋势分析Sen+mk

Map.centerObject(table);// 定义时间范围 var stary 2001, endy 2023; //NDVI图像集合 var NDVICL ee.ImageCollection(ee.List.sequence(stary, endy).map(function(year) {// 定义每年的开始和结束日期var startd ee.Date.fromYMD(year, 1, 1);var endd ee.Date.fromYM…

基于单片机的激光测距系统设计

摘要: 为了减小测距误差,提出一种基于单片机的激光测距系统设计方法,首先基于三角测量原理构成测距传感器,以进行实时测量与检测,并对目标激光信号进行小波变换和二进小波变换; 然后利用Lipschitz 指数检测出激光信号的奇异点位置,并采用正交调制技术对激光光强的幅度进行…

精益管理培训在哪些行业比较适用?

在当今瞬息万变的市场环境中&#xff0c;企业竞争日趋激烈&#xff0c;如何提升内部管理水平、降低成本、提高效率&#xff0c;成为企业持续发展的关键。精益管理作为一种先进的管理理念和方法&#xff0c;正逐渐被越来越多的行业所采纳和应用。本文&#xff08;深圳天行健精益…

Python基础语法入门:构建坚实的编程基础

欢迎来到Python编程的第一课&#xff01;Python是一种优雅而强大的编程语言&#xff0c;因其简洁的语法和强大的功能而广受欢迎。虽然说说Python是简单的&#xff0c;但是想在仅仅一篇博客中&#xff0c;讲解清除Python的基础语法&#xff0c;也仍然是个挑战&#xff0c;在本篇…

【Vue】响应式原理与ref

首先讲讲JS中的Proxy JavaScript 运行环境包含了一些不可枚举、不可写入的对象属性&#xff0c;然而在 ES5 之前开发者无法定义他们自己的不可枚举属性或不可写入属性。ES5 引入 Object.defineProperty() 方法以便开发者在这方面能够像 JS 引擎那样做。 ES6 为了让开发者能进…

闭包用运。

闭包在JavaScript编程中有多种实用场景&#xff0c;以下列举几个常见的闭包使用场景并附上相应的代码示例&#xff1a; 不使用 new 关键字调用构造函数时&#xff0c;构造函数内部的 this 关键字会指向全局对象&#xff08;在浏览器中通常是 window 对象&#xff09;。此时&am…

【C语言】:字符函数和字符串函数

这里写目录标题 1、strlen的使用和模拟实现2、strcpy的使用和模拟3、strcat 的使用和模拟实现4、strcmp 的使用和模拟实现5、strncpy 函数的使用6、strncat 函数的使用7、strncmp函数的使用8、strstr 的使用和模拟实现9、strtok 函数的使用10、strerror 函数的使用11、字符分类…

C语言——关于指针运算的例题分析

1.指针运算中关于 sizeof 和 strlen 的例题分析 1. sizeof(数组名)&#xff0c;这⾥的数组名表⽰整个数组&#xff0c;计算的是整个数组的⼤⼩。 2. &数组名&#xff0c;这⾥的数组名表⽰整个数组&#xff0c;取出的是整个数组的地址。 3. 除此之外所有的数组名都表⽰…

汇编入门--基础知识(1)

1.汇编语言的概念 汇编语言是一种低级编程语言&#xff0c;它与计算机的机器语言非常接近&#xff0c;但比机器语言更易于人类阅读和理解。汇编语言是用一系列的助记符来表示机器语言的操作码和操作数。每种计算机体系结构&#xff08;如x86、ARM等&#xff09;都有自己的汇编语…

linux系统上做性能压力测试 —— 筑梦之路

这里主要使用stress 和 stress-ng。 简介 stress: stress 是一款简单但功能强大的工具&#xff0c;可对 Linux 系统施加可配置的 CPU、内存、I/O 或磁盘压力。通过模拟繁重的工作负载&#xff0c;系统管理员可以观察系统在压力下的表现反应。 这一工具的价值在于找出系统潜在的…