梅花桩详细分析圆内贪心思路(dfs)
问题描述
小明每天都要练功,练功中的重要一项是梅花桩。
小明练功的梅花桩排列成 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。
思路:
考虑 B F S BFS BFS,将左上角坐标 ( 1 , 1 ) (1,1) (1,1)入队,令 d [ 1 ] [ 1 ] d[1][1] d[1][1] 处为0。不断将队头出队,并将与队头坐标 ( i , j ) (i,j) (i,j)距离 d i s < d dis<d dis<d 的所有坐标入队,并将其坐标对应的 d [ x ] [ y ] d[x][y] d[x][y] 标记为 d [ i ] [ j ] + 1 d[i][j]+1 d[i][j]+1 ,直到队列为空,此时, d [ n ] [ m ] d[n][m] d[n][m] 处即为答案。
但这并不好实现,在找与队头坐标 ( i , j ) (i,j) (i,j)距离 d i s < d dis<d dis<d 的所有坐标的过程中,如果搜索全图,必然TLE,所以我们要尽可能贪心地找最外围的情况,因为搜索的范围是一个圆心在左上角的 1 4 \dfrac {1}{4} 41圆,所以我们可以采用圆内贪心:
先搜索圆的右边界: t y = y + ( i n t ) d ty = y + (int)d ty=y+(int)d(由于不能掉下梅花桩,我们必须取 y + ( i n t ) d y + (int)d y+(int)d为最右的边界),这肯定能到达,之后采取贪心法找边界:我们从上到下去找圆的最右边界(当然是整数点),也就是一直tx ++
,但是总会有一个时刻点会超出圆的右边界,这时我们需要缩小点的横坐标,即ty --
,直到满足圆内,我们继续tx ++
,这样一定能找到所有最外围情况的点
代码:
#include <bits/stdc++.h>
using namespace std;
const int N = 1004
int dis[N][N];
int n,m;
double d;
queue< pair<int,int> >q;
void bfs(){q.push(make_pair(1, 1));while(!q.empty()){pair<int,int> t = q.front(); q.pop();int x = t.first, y = t.second;int tx = x, ty = y + (int)d;//先向右移动d if((n-x)*(n-x) + (m-y)*(m-y) <= d*d){dis[n][m] = dis[x][y] + 1;break;}while(tx <= n && ty >= y && ty <= m){if((tx - x) * (tx - x) + (ty - y) * (ty - y) <= d * d && dis[tx][ty] == 0){q.push(make_pair(tx, ty));dis[tx][ty] = dis[x][y] + 1;tx ++;}else ty --;}}cout<<dis[n][m]<<endl;
}
int main(){cin>>n>>m>>d;bfs();return 0;
}
ps.
代码部分借鉴自:蓝桥杯校内模拟赛题解
梅花桩详细分析圆内贪心思路(dfs)相关推荐
- Power BI 中 关键影响因素(Key Influencers Visualization)功能详细分析(内附福利)——Power BI迈向AI的一大步?
目录 写在前面 功能介绍 功能详解 写在最后 写在前面 继解释此增长/下降和分析此分布的不同之处过后,Power BI在2月份又抛出了一枚重磅炸弹--Key Influencers Visualiza ...
- 客户端访问https时应无浏览器(含终端)安全警告信息;_https和http有什么区别(内附详细分析)...
很多站长知道https和http有所不同,但是究竟两者有什么不同浑然不知,针对这种情况,本文Seo星火给大家详细分析一下https和http有什么区别. 一.基本概念: (http服务器-->本 ...
- https和http有什么区别(内附详细分析)
很多站长知道https和http有所不同,但是究竟两者有什么不同浑然不知,针对这种情况,本文给大家详细分析一下https和http有什么区别. 一.基本概念(http服务器–>本地浏览器,正确快 ...
- LeetCode#546. 移除盒子 (Python解法+详细分析)
问题描述: 给出一些不同颜色的盒子,盒子的颜色由数字表示,即不同的数字表示不同的颜色. 你将经过若干轮操作去去掉盒子,直到所有的盒子都去掉为止.每一轮你可以移除具有相同颜色的连续 k 个盒子(k &g ...
- LinkedHashMap 源码详细分析(JDK1.8)
1. 概述 LinkedHashMap 继承自 HashMap,在 HashMap 基础上,通过维护一条双向链表,解决了 HashMap 不能随时保持遍历顺序和插入顺序一致的问题.除此之外,Linke ...
- HashMap 源码详细分析(JDK1.8)
1. 概述 本篇文章我们来聊聊大家日常开发中常用的一个集合类 - HashMap.HashMap 最早出现在 JDK 1.2中,底层基于散列算法实现.HashMap 允许 null 键和 null 值 ...
- linkedhashmap 顺序_LinkedHashMap 源码详细分析(JDK1.8)
1. 概述 LinkedHashMap 继承自 HashMap,在 HashMap 基础上,通过维护一条双向链表,解决了 HashMap 不能随时保持遍历顺序和插入顺序一致的问题.除此之外,Linke ...
- 13万字详细分析JDK中Stream的实现原理
前提 Stream是JDK1.8中首次引入的,距今已经过去了接近8年时间(JDK1.8正式版是2013年底发布的).Stream的引入一方面极大地简化了某些开发场景,另一方面也可能降低了编码的可读性( ...
- 乐鑫esp8266学习rtos3.0笔记第11篇:详细分析Esp8266上电信息打印的数据,如何做到串口通讯上电不乱码打印。
本系列博客学习由非官方人员 半颗心脏 潜心所力所写,不做开发板.仅仅做个人技术交流分享,不做任何商业用途.如有不对之处,请留言,本人及时更改. 序号 SDK版本 内容 链接 1 nonos2.0 搭建 ...
最新文章
- Linux下进程间通信——管道
- 深度学习笔记——基于传统机器学习算法(LR、SVM、GBDT、RandomForest)的句子对匹配方法
- 单例模式---设计模式
- ContentProvider与ContentResolver使用
- 美图赏析:拆解USB无线网卡,电路方案非常经典
- Elasticsearch 6.x 下载安装
- RHEL7/CentOS7 Network Service开机无法启动的解决方法
- XML(1):基于流的XML处理
- WINDOWS NT/2000下如何屏蔽CTRL+ALT+DEL
- C语言—黑客数字雨特效
- Windows设置开机自启动的三种方式
- urlencode与unquote
- 良心推荐:某音上最厉害的明日之后房子蓝图设计师都在这里了
- 电子认证许可证书(电子签名 需要 什么资质)
- python汉明距离检索_【LeetCode 461】汉明距离(Python)
- 数据库—distinct是什么意思?select distinct怎么用?
- Solr安装配置(包含Tomcat和jdk)
- 需不需要懂代码?——软件测试人员
- sybase数据库的两种备份方法
- vue 公告栏组件