题目描述
如下图所示的螺旋折线经过平面上所有整点恰好一次。
样例输入
0 1
样例输出
3
这个题我从转折点坐标下手找规律,经过我一波分析,转折点的坐标往往都与前面走的步数相关,除了第四象限外,它刚走的步数等于其坐标绝对值之和,而且有很明显的规律可寻找,所以基于此我们可以对任意一点先去寻找其距离最近的转折点坐标,计算零点到转折点的距离,再加上其与转折点之差,就是结果了。
对于输入的x和y,我们先判断其是不是转折点,如果是的话直接存储,不是的话找到其走过的上一个转折点,任何一个点都可以分为这个正方形四个边的某边,所以我们先确定它是哪个边的,再确定其上一个转折点,转折点的寻找的,可以说是遵循逆时针原则,你要是想顺时针的找的话也可以,就是把该点与转折点的距离减去就好了。
根据四个转折点的规律可以求出其走过的路径,我这里写了个函数计算以x为结果等差数列之和的二倍。注意数据类型一定要全开long long。
最后再检查一下最开始的几个点是否需要特判就可以了。
代码如下:
#include<bits/stdc++.h>
using namespace std;
long long calculate(long long x){
return (1+x)*x;
}
int main()
{
long long x,y;
cin>>x>>y;
if(x==0&&y==0){
cout<<0<<endl;
return 0;
}
else if(x==-1&&y==0){
cout<<1<<endl;
return 0;
}
long long tx,ty;//距离x、y最近的转折点
int sheng=0; //该点与转折点的距离
if(((x>=0||y>=0)&&(abs(x)==abs(y)))||((x<0&&y<0)&&((abs(x)-1)==abs(y))))
tx=x,ty=y;
else{
if(y>0&&(abs(x)<y)){
ty=y,tx=-y;
sheng=x-tx;
}
else if(x>0&&(abs(y)<x)){
tx=x,ty=x;
sheng=ty-y;
}
else if(y<0&&(x<abs(y)&&x>y-1)){
ty=y,tx=-y;
sheng=tx-x;
}
else if(x<0&&(y<abs(x)&&y>x+1)){
tx=x,ty=x+1;
sheng=y-ty;
}
}
long long sum=0;//零点到转折点走过的总路程
if(tx>0&&ty>0){
sum+=calculate(tx*2-1);
sum+=tx*2;
}
else if(tx>0&&ty<0){
sum+=calculate(tx*2);
}
else if(tx<0&&ty<0){
sum+=calculate(-tx-ty-1);
sum+=(-tx-ty);
}
else if(tx<0&&ty>0){
sum+=calculate(ty*2-1);
}
cout<<sum+sheng<<endl;
return 0;
}