杭电1030
来源:互联网 发布:鹤壁招聘编程 编辑:程序博客网 时间:2024/06/06 00:56
这道题思路和网上两点求坐标差的方法不同。
主要思路如下:
首先假设起始块值<=目标块值,接着以起始块为顶点(若起始块是正三角,则起始块为顶点,否则起始块正上方为顶点)以目标快所在行为底边存在唯一一个等边三角形。
假设起始块所在行为c1,目标块所在行为c2,则经过(c2-c1)* 2步(起始块为倒三角)或(c2-c1)*2-1步(起始块为正三角)即可到达底边中任意一个倒三角块,且此为最短路径。如果目标块在该正三角形底边范围内,则经过上述步(或者+1步,目标快为正三角)即可到达,否则,按照常规平移即可。
代码如下:
#include<iostream>#include<math.h>using namespace std;int main(){ long m,n; while(cin>>m>>n){ if(m>n){//保证m<=n int t=n; n=m; m=t; } int c1=sqrt(m)>int(sqrt(m))?(int)(sqrt(m))+1:sqrt(m); int c2=sqrt(n)>int(sqrt(n))?(int)(sqrt(n))+1:sqrt(n); int down=0; for(int i=c1;i<=c2-1;i++){ down+=i*2; } int go_left_right=c2-c1-1; int r_go_left_right=c2-c1; int left; int right; int step; if(m%2==c1%2){//以正三角开始 left=down-go_left_right+m; right=down+go_left_right+m; step=(c2-c1)*2-1; }else{//以倒三角开始 left=down-r_go_left_right+m; right=down+r_go_left_right+m; step=(c2-c1)*2; } if(n>=left&&n<=right){//落在范围内 if(n%2==c2%2)//是正三角 step+=1; }else{ int t=n<left?left-n:n-right; step+=t; } cout<<step<<endl; } return 0;}
阅读全文
0 0
- 杭电1030
- 杭电1030
- 杭电1030
- 杭电 1030 Delta-wave
- 杭电 1030 Delta-wave
- 杭电
- 杭电
- 杭电
- acm 杭电 Delta-wave 1030
- 杭电OJ 1030:Delta-wave
- 数学—杭电1030 Delta-wave
- 杭电 1234 和 杭电 2115
- 杭电2056之Rectangles 杭电
- 杭电ACM1061Rightmost Digit
- 杭电2099 7.11
- 杭电ACM 1003
- 杭电 ACM 2016
- 杭电ACM1466
- Java
- [BZOJ]1977 次小生成树 树上倍增
- 上传图片前预览
- 系统吞吐量、TPS(QPS)、用户并发量、性能测试概念和公式
- MTK-[FAQ14377]L1版本配置sensor 安装角度
- 杭电1030
- 【EF】EF中的对表操作
- vue-cli开发(一)项目开始
- d3自定义树图备份
- 300.7实现两个变量的互换,不借助第三个变量
- srilm的使用(二)
- 文件读写:fwrite与fprintf的区别(即二进制方式和文本方式的区别)
- DataBinding基本使用(3)
- Ubuntu Django安装和创建项目