Date:2022.04.01
题意描述:
如下图所示的螺旋折线经过平面上所有整点恰好一次。
对于整点 (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
思路:观察可得找到绝对值最大的横纵坐标,其abs(maxx)-1则为maxx-1个“同心正方形”,边长递增。由此,单独讨论
y
=
x
、
y
=
−
x
y=x、y=-x
y=x、y=−x两条线划分出的四个区间以及四个边界。
代码如下:
#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
LL x,y;
int main()
{
cin>>x>>y;
LL maxx=max(abs(x),abs(y)),ans=0;
//四个角单独考虑,不能有交集
if(abs(x)==abs(y)&&x<0&&y>0) ans+=maxx*2;
else if(abs(x)==abs(y)&&x>0&&y>0) ans+=maxx*4;
else if(abs(x)==abs(y)&&x>0&&y<0) ans+=maxx*6;
else if(abs(x)==abs(y)&&x<0&&y<0) ans+=maxx*8;
//四个象限单独考虑
if(x<0&&(y>-maxx&&y<maxx)) ans+=y+maxx;
else if(y>0&&(x>-maxx&&x<maxx)) ans+=3*maxx+x;
else if(x>0&&(y>-maxx&&y<maxx)) ans+=4*maxx+abs(y-maxx);
else if(y<0&&(x>-maxx&&x<maxx)) ans+=6*maxx+abs(x-maxx);
ans+=8*(maxx-1)*maxx/2;
cout<<ans;
return 0;
}