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

标题:螺旋折线
如图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;
} 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值