文章目录
前言
蓝桥杯2018年省赛,编程题(C++)
一、题目描述
如下图所示的螺旋折线经过平面上所有整点恰好一次。
对于整点 (X,Y),我们定义它到原点的距离 dis(X, Y)dis(X,Y) 是从原点到 (X,Y) 的螺旋折线段的长度。
例如 dis(0,1)=3,dis(−2,−1)=9。
给出整点坐标(X,Y),你能计算出 dis(X,Y) 吗?
输入描述
输入格式:
输入一行,X 和 Y ,−10^9 ≤X,Y≤10^9。
输出描述
输出 dis(X,Y)。
输入输出样例
示例
0 1
3
运行限制
- 最大运行时间:1s
- 最大运行内存: 256M
二、思路
这个题目如果从起点开始逐个遍历,必然会超时,仔细观察题目所给的折线,会发现有这样的规律:
如果我们要求取小红星位置的距离,其实是内圈的两个正方形加上小红星到最外圈左下角的距离,原理就是将黄色的线段旋转90度,形成了一个完整的正方形。有了这个思路,代码其实就很容易写出来了。
三、代码
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int main()
{
ll x,y;
cin>>x>>y;
ll max=abs(x);
if(max<abs(y))
{
max=abs(y);
}
ll ans=0;
for(ll i=1;i<max;i++) //先计算内层的方块个数
{
ans+=8*i;
}
//最外圈单独计算,要进行优化
ll temp_x=-max;
ll temp_y=-max;
//先判断在哪一边
if(x==-max&&y>=-max&&y<=max) //在左边
{
ans+=y-temp_y;
}
else if(y==max&&x>=-max&&x<=max) //在上边
{
ans+=2*max+x-temp_x;
}
else if(x==max&&y>=-max&&y<=max) //在右边
{
ans+=4*max+max-y;
}
else //在下边
{
ans+=6*max+max-x;
}
cout<<ans<<endl;
return 0;
}