您的位置:首页 > 其它

蓝桥杯第九届省赛:第七题 螺旋折线

2018-04-04 11:05 253 查看
标题:螺旋折线
如图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



思路:先找规律:上图就是我找的规律。  分四个象限 分情况算 #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 = abs(x);y = abs(y);
if(x >= y + 1) cnt = cnt - 6 * max - y;
else cnt += x;
}
printf("%d", cnt);
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: