蓝桥杯算法题:练功

news2024/11/27 0:16:03

【问题描述】
小明每天都要练功,练功中的重要一项是梅花桩。
小明练功的梅花桩排列成 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开始的,所以自然多了一个1
		int 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.coloradmin.cn/o/1577498.html

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

相关文章

如何使用固定公网地址SSH远程访问本地内网openEuler系统

文章目录 1. 本地SSH连接测试2. openEuler安装Cpolar3. 配置 SSH公网地址4. 公网远程SSH连接5. 固定连接SSH公网地址6. SSH固定地址连接测试 欧拉操作系统(openEuler, 简称“欧拉”)是面向数字基础设施的操作系统,支持服务器、云计算、边缘openEuler是面向数字基础设施的操作系…

xgo: golang基于-toolexec实现猴子补丁

注&#xff1a; 转载请注明出处&#xff0c; 原文链接。 概述 在这篇博客中&#xff0c;我将详细介绍 xgo 的实现细节。 如果你不知道&#xff0c;xgo 项目位于 https://github.com/xhd2015/xgo。 它的作用很简单&#xff0c;就是在每个 Go 函数的开头添加拦截器&#xff0…

【C++】手搓 list 容器

送给大家一句话&#xff1a; 若结局非你所愿&#xff0c;就在尘埃落定前奋力一搏。—— 《夏目友人帐》 手搓 list 容器 1 前言1. 1 底层结构1.2 使用场景1.3 功能简介 2 框架搭建2.1 节点类2.2 list 类2.3 迭代器类 3 功能实现3.1 begin() 与 end()3.2 插入操作3.3 删除操作…

Ps 滤镜:查找边缘

Ps菜单&#xff1a;滤镜/风格化/查找边缘 Filter/Stylize/Find Edges 查找边缘 Find Edges滤镜能够突出图像中的边缘&#xff0c;同时保留原图的颜色信息。 “查找边缘”滤镜通过分析图像的色彩和亮度变化来识别边缘。 这种处理方式使得图像的主要轮廓以一种艺术化的线条形式被…

SAP ABAP-BOPF基础培训-02 导入、节点和关联

1. 介绍-Introduction 业务对象实例示例&#xff1a;本次案例主要探讨客户发票业务对象内容。ESR中建模的业务对象示例&#xff1a; 发票的结构和属性在ESR中建模。在使用业务对象之前&#xff0c;我们需要首先实现该模型的所有功能。 2. 导入业务对象代理-Importing a Bus…

力扣刷题 二叉树层序遍历相关题目

NO.107 二叉树的层次遍历 II 给定一个二叉树&#xff0c;返回其节点值自底向上的层次遍历。 &#xff08;即按从叶子节点所在层到根节点所在的层&#xff0c;逐层从左向右遍历&#xff09; 示例 1&#xff1a; 输入&#xff1a;root [3,9,20,null,null,15,7] 输出&#xff1…

面试题:volatile

一旦一个共享变量&#xff08;类的成员变量、类的静态成员变量&#xff09;被volatile修饰之后&#xff0c;那么就具备了两层语义&#xff1a; 1. 保证线程间的可见性 保证了不同线程对这个变量进行操作时的可见性&#xff0c;即一个线程修改了某个变量的值&#xff0c;这新值…

新零售SaaS架构:客户管理系统架构设计(万字图文总结)

什么是客户管理系统&#xff1f; 客户管理系统&#xff0c;也称为CRM&#xff08;Customer Relationship Management&#xff09;&#xff0c;主要目标是建立、发展和维护好客户关系。 CRM系统围绕客户全生命周期的管理&#xff0c;吸引和留存客户&#xff0c;实现缩短销售周…

【AN】简单的实现点击播放影片剪辑再点击暂停的功能

动画故事背景 一个影片剪辑&#xff0c;里面做了一个动画。我希望影片剪辑一开始是暂停的&#xff0c;按钮点击后开始播放&#xff0c;再次点击就暂停&#xff01; 下图那个花瓣就是影片剪辑&#xff0c;里面有个掉落的路径引导动画&#xff01; 1.首先给花瓣影片剪辑一个实例…

SSM项目转Springboot项目

SSM项目转Springboot项目 由于几年前写的一个ssm项目想转成springboot项目&#xff0c;所以今天倒腾了一下。 最近有人需要毕业设计转换一下&#xff0c;所以我有时间的话可以有偿帮忙转换&#xff0c;需要的私信我或&#xff0b;v&#xff1a;Arousala_ 首先创建一个新的spr…

GD32F470_GP2Y0A02YK0F 红外激光测距传感器 避障测距20-150cm模块移植

2.4 红外测距传感器 GP2Y0A02YKOF是夏普的一款距离测量传感器模块。它由PSD(position sensitive detector)和IRED(infrared emitting diode)以及信号处理电路三部分组成。由于采用了三角测量方法,被测物体的材质、环境温度以及测量时间都不会影响传感器的测量精度。传感器输出电…

【迅为iTOP-4412-linux 系统制作(1)】linux内核移植-5.4并适配设备树

准备工作 服务器&#xff1a;Ubuntu 18 sudo apt install gcc-arm-linux-gnueabihf(arm-linux-gnueabihf-gcc (v7.4, 安装方法: sudo apt install gcc-arm-linux-gnueabihf)) sudo apt install flex sudo apt install bison sudo apt install u-boot-tools目标开发板 CPU (E…

算法实验二 矩阵最小路径和 LIS

算法实验课二 矩阵最小路径和 leetcode裸题 最小路径和 给定一个包含非负整数的 *m* x *n* 网格 grid &#xff0c;请找出一条从左上角到右下角的路径&#xff0c;使得路径上的数字总和为最小。 说明&#xff1a;每次只能向下或者向右移动一步。 示例 1&#xff1a; 输入&…

Excel 文件底部sheet 如何恢复

偶然打开一个excel文件&#xff0c;惊奇地发现&#xff1a;原来excel文件底部的若干个sheet居然全都看不到了。好神奇啊。 用其它的电脑打开同样的excel文件&#xff0c;发现&#xff1a;其实能看到的。说明这个excel文件并没有被损坏。只要将修改相关设置。就可以再次看…

Mysql底层原理四:B+树索引

B树索引&#xff08;索引的原理&#xff09; 1.前言 前边我们详细唠叨了InnoDB数据⻚的7个组成部分&#xff0c;知道了各个数据⻚可以组成⼀个双向链表&#xff0c;⽽每个数据⻚中的记录会按照主键值从⼩到⼤的顺序组成⼀个单向链 表&#xff0c;每个数据⻚都会为存储在它⾥边…

SpringCloud Alibaba @SentinelResource 注解

一、前言 接下来是开展一系列的 SpringCloud 的学习之旅&#xff0c;从传统的模块之间调用&#xff0c;一步步的升级为 SpringCloud 模块之间的调用&#xff0c;此篇文章为第十五篇&#xff0c;即介绍 SpringCloud Alibaba 的 SentinelResource 注解。 二、简介 这个注解用于标…

Agenda家族再升级,跨平台定制化勒索引关注

Agenda勒索也被称为Qilin勒索&#xff0c;该家族的早期版本使用Go 语言编写的&#xff0c;增加了安全分析的难度。其早期版本是针对每位受害者定制的&#xff0c;使用受害者的机密信息&#xff08;例如泄露的帐户和唯一的公司 ID&#xff09;作为附加文件扩展名。针对早期版本A…

TS封装axios并约束请求参数以及响应的类型

封装一个简单的axios src/utils/axiosInstance.ts&#xff1a;其中定义了基本返回数据的类型 import axios, {AxiosInstance,AxiosResponse,AxiosError,AxiosRequestConfig, } from "axios"// 定义基本返回数据类型 export interface ApiResponse<T> {code: …

蓝桥杯-DS18B20温度传感器

一.管脚&芯片&寄存器 1.芯片 2.了解封装以及引脚的用法 3.相关寄存器 报警功能 二&#xff0c;如何使能DS18B20芯片 1.初始化芯片&比赛提供的驱动代码 比赛提供的底层驱动代码 /* # 单总线代码片段说明1. 本文件夹中提供的驱动代码供参赛选手完成程序设计参考…

基于R语言lavaan结构方程模型(SEM)实践技术应用

原文链接&#xff1a;基于R语言lavaan结构方程模型&#xff08;SEM&#xff09;实践技术应用https://mp.weixin.qq.com/s?__bizMzUzNTczMDMxMg&mid2247596681&idx4&sn08753dd4d3e7bc492d750c0f06bba1b2&chksmfa823b6ecdf5b278ca0b94213391b5a222d1776743609cd…