0
点赞
收藏
分享

微信扫一扫

算法练习题39---蓝桥杯2018省赛“螺旋折线”

善解人意的娇娇 2022-03-11 阅读 52

文章目录


前言

蓝桥杯2018年省赛,编程题(C++)

一、题目描述

如下图所示的螺旋折线经过平面上所有整点恰好一次。

在这里插入图片描述

对于整点 (X,Y),我们定义它到原点的距离 dis(X, Y)dis(X,Y) 是从原点到 (X,Y) 的螺旋折线段的长度。

例如 dis(0,1)=3,dis(−2,−1)=9。

给出整点坐标(X,Y),你能计算出 dis(X,Y) 吗?

输入描述

输入格式:

输入一行,X 和 Y ,−10^9 ≤X,Y≤10^9。

输出描述

输出 dis(X,Y)。

输入输出样例

示例

0 1
3

运行限制

  • 最大运行时间:1s
  • 最大运行内存: 256M

二、思路

这个题目如果从起点开始逐个遍历,必然会超时,仔细观察题目所给的折线,会发现有这样的规律:

在这里插入图片描述

如果我们要求取小红星位置的距离,其实是内圈的两个正方形加上小红星到最外圈左下角的距离,原理就是将黄色的线段旋转90度,形成了一个完整的正方形。有了这个思路,代码其实就很容易写出来了。

三、代码

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int main()
{
	ll x,y;
	cin>>x>>y;
	ll max=abs(x);
	if(max<abs(y))
	{
		max=abs(y);
	}
	ll ans=0;
	for(ll i=1;i<max;i++)  //先计算内层的方块个数
	{
		ans+=8*i;
	}
	//最外圈单独计算,要进行优化
	ll temp_x=-max;
	ll temp_y=-max;
	//先判断在哪一边
	if(x==-max&&y>=-max&&y<=max)  //在左边
	{
		ans+=y-temp_y;
	}
	else if(y==max&&x>=-max&&x<=max)  //在上边
	{
		ans+=2*max+x-temp_x;
	}
	else if(x==max&&y>=-max&&y<=max)  //在右边
	{
		ans+=4*max+max-y;
	}
	else  //在下边
	{
		ans+=6*max+max-x;
	}
	cout<<ans<<endl;
	return 0;
}
举报

相关推荐

0 条评论