题目
如下图所示的螺旋折线经过平面上所有整点恰好一次。
对于整点 (X,Y),我们定义它到原点的距离 dis(X,Y) 是从原点到 (X,Y)的螺旋折线段的长度。
例如 dis(0,1)=3,dis(−2,−1)=9
给出整点坐标 (X,Y),你能计算出 dis(X,Y)吗?
输入格式
包含两个整数 X,Y。
输出格式
输出一个整数,表示 dis(X,Y)。
数据范围
−109≤X,Y≤109
输入样例:
0 1
输出样例:
3
分析
这个题可以找规律来做
可以发现左上角的点都是等于2n(2n-1),n是表示第几圈,右上角的点都是(2n)(2n),
左下角的点是(2n-1) * (2n-1),右下角的是(2n) * (2n+1)
先判断是上下左右那个上面的,然后再找到这条边的起点是多少再加上偏移量
代码
#include<cmath>
#include<iostream>
using namespace std;
int main()
{
int x,y;
cin>>x>>y;
if(abs(x)<=y) //上面
{
int n=y;
cout<<(long long)(2*n)*(2*n-1)+x+n<<endl;
}
else if(abs(x)<=abs(y)+1&&y<0) //下面
{
int n=abs(y);
cout<<(long long)(2*n)*(2*n+1)+n-x<<endl;
}
else if(abs(y)<=abs(x)&&x<0) //左面
{
int n=abs(x);
cout<<(long long)(2*n-1)*(2*n-1)+y-(-n+1)<<endl;
}
else if(abs(y)<=x) //右面
{
int n=x;
cout<<(long long)(2*n)*(2*n)+n-y<<endl;
}
return 0;
}