标题:螺旋折线
如图p1.png所示的螺旋折线经过平面上所有整点恰好一次。
对于整点(X, Y),我们定义它到原点的距离dis(X, Y)是从原点到(X, Y)的螺旋折线段的长度。
例如dis(0, 1)=3, dis(-2, -1)=9
给出整点坐标(X, Y),你能计算出dis(X, Y)吗?
【输入格式】
X和Y
对于40%的数据,-1000 <= X, Y <= 1000
对于70%的数据,-100000 <= X, Y <= 100000
对于100%的数据, -1000000000 <= X, Y <= 1000000000
【输出格式】
输出dis(X, Y)
【样例输入】
0 1
【样例输出】
如图p1.png所示的螺旋折线经过平面上所有整点恰好一次。
对于整点(X, Y),我们定义它到原点的距离dis(X, Y)是从原点到(X, Y)的螺旋折线段的长度。
例如dis(0, 1)=3, dis(-2, -1)=9
给出整点坐标(X, Y),你能计算出dis(X, Y)吗?
【输入格式】
X和Y
对于40%的数据,-1000 <= X, Y <= 1000
对于70%的数据,-100000 <= X, Y <= 100000
对于100%的数据, -1000000000 <= X, Y <= 1000000000
【输出格式】
输出dis(X, Y)
【样例输入】
0 1
【样例输出】
3
思路:先找规律:上图就是我找的规律。
(0,0)-(0,-1):7 =1*8-1;
(0,0)-(0,-2):7+15=1*8-1 + 2*8-1
(0,0)-(0,-3):7+15+23=1*8-1 + 2*8-1 + 3*8-1
分四个象限 分情况算
#include<cstdio>
#include<cmath>
using namespace std;
int main(){
long long int x, y, cnt = 0;
scanf("%lld %lld",&x, &y);
int max = abs(x) > abs(y) ? abs(x) : abs(y);
for(int i = 1; i <= max; i++){
cnt += 8 * i -1;
}
if(x <= 0 && y >= 0){
if(abs(x) >= y) cnt = cnt - 6 * max + y; //第二象限竖着的线
else cnt = cnt - 4 * max - abs(x); //横着的线
}else if(x > 0 && y > 0){ //第一象限
if(x >= y) cnt = cnt - 2 * max - y;
else cnt = cnt - 4 * max + x;
}else if(x >= 0 && y <= 0){
if(abs(y) <= x) cnt = cnt - 2 * max + abs(y);
else cnt = cnt - abs(x);
}else if(x < 0 && y < 0){ // 第三象限 要注意(-(x + 1), -y)的点, 跟前面的判断方法不一样 横竖长度不相等
x = abs(x);y = abs(y); //x 和 y都是绝对值的xy
if(x >= y + 1) cnt = cnt - 6 * max - y;
else cnt += x;
}
printf("%d", cnt);
return 0;
}