题目描述
如下图所示的螺旋折线经过平面上所有整点恰好一次。
对于整点 (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
数据范围较大,找规律O(1),不然会超时,
数据范围小的时候可以用蛇形矩阵做或者按边走:
1.756.蛇形矩阵
2.按边走,O(1e9),还是会tle,时间不够了
蓝桥杯时如果找不到规律,按上面的写法还是可以拿部分分数的
#include <cstring>
#include <iostream>
#include <algorithm>
#include <cmath>
#define LL long long //数据范围较大 1e9,开 long long,不然乘的时候可能会爆int
using namespace std;
int x,y;
int n;//代表层数
int main()
{
scanf("%d%d",&x,&y);
if(abs(x)<=y){//在上方
n=y;
cout<<(LL)(2*n-1)*(2*n)+x-(-n)<<endl;
}
else if(abs(y)<=x){//在右边
n=x;
cout<<(LL)2*n*2*n+n-y<<endl;
}
else if(abs(x)<=abs(y)+1&&y<0){//在下边
n=-y;
cout<<(LL)(2*n)*(2*n+1)+n-x<<endl;
}
else {//在左边
n=-x;
cout<<(LL)(2*n-1)*(2*n-1)+y-(-n+1)<<endl;
}
return 0;
}