如图所示的螺旋折线经过平面上所有整点恰好一次。
对于整点(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)
样例输入
0 1
样例输出
3
题解:找规律变形,把图变成这个样子,如果n层,(-n,-n)就是起点,再把终点分为四种情况,终点在每条边对应的情况不同
第i层 | 边长 | 周长 | 前i层和 | ||
1 | 2 | 8 | 8 | ||
2 | 4 | 16 | 24 | ||
3 | 6 | 24 | 48 | ||
... | |||||
... | |||||
... | |||||
n | 2*n | 8*n | 8*n*(n+1)/2 |
#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
#define ll long long
ll n;
ll ti(ll tx,ll ty)
{
ll s=2*n;
if(ty==-n)
return abs(ty-(-n)+tx-(-n));
else if(tx==n)
return s+abs(tx-n+(ty-(-n)));
else if(ty==n)
return s*2+abs(tx-n+(ty-n));
else if(tx==-n)
return s*3+abs(tx-(-n)+ty-n);
}
int main()
{
ll x,y;
scanf("%lld%lld",&x,&y);
n=max(abs(x),abs(y));
long long ans;
ans=4*n*(n+1)-ti(x,y);
printf("%lld\n",ans);
return 0;
}