如图所示的螺旋折线经过平面上所有整点恰好一次。
对于整点(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
对于40%的数据,-1000 <= X, Y <= 1000
对于70%的数据,-100000 <= X, Y <= 100000
对于100%的数据, -1000000000 <= X, Y <= 1000000000
解题思路
这种题目给出来一定是找规律做的。
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
struct point{
ll x=0;
ll y=0;
};
int main()
{
//一个周期,左,上,右,下
//第i个周期,左,上分别移动t步,右,下分别移动t+1步
struct point p,f;
ll step=0;
ll t=1,flag=0;
cin>>p.x>>p.y;
while(1){
if(f.x==p.x&&f.y==p.y) break;
if(f.x<p.x){
step+=t;f.x-=t;
}
else{
for(ll i=1;i<=t;i++){//左
f.x--;step++;
if(f.x==p.x&&f.y==p.y){
flag=1;break;
}
}if(flag) break;
}
if(f.y>p.y){
step+=t;f.y+=t;
}
else{
for(ll i=1;i<=t;i++){//上
f.y++;step++;
if(f.x==p.x&&f.y==p.y){
flag=1;break;
}
}if(flag) break;
} if(f.x>p.x){
step+=t+1;f.x+=t+1;
}
else{
for(ll i=1;i<=t+1;i++){//右
f.x++;step++;
if(f.x==p.x&&f.y==p.y){
flag=1;break;
}
}if(flag) break;
}
if(f.y<p.y){
step+=t+1;f.y-=(t+1);
}else{
for(ll i=1;i<=t+1;i++){//下
f.y--;step++;
if(f.x==p.x&&f.y==p.y){
flag=1;break;
}
}if(flag) break;
}
t+=2;//之前写成t++,仔细观察你会发现第一个周期是1开始的,第一个周期t=1;第二个周期t=t+2;
//第二个周期是3开始的,第三个周期是5开始的
}cout<<step;
return 0;
}