蓝桥杯2018年第九届真题——螺旋折线

螺旋折线


一、题目内容

题目描述

如图所示的螺旋折线经过平面上所有整点恰好一次。对于整点(X, Y),我们定义它到原点的距离dis(X, Y)是从原点到(X, Y)的螺旋折线段的长度,例如dis(0, 1)=3, dis(-2, -1)=9 。给出整点坐标(X, Y),你能计算出dis(X, Y)吗?

蓝桥杯2018年第九届真题——螺旋折线

输入

X和Y 

输出

输出dis(X, Y) 

样例输入

0 1

样例输出

3

二、思路分析

蓝桥杯2018年第九届真题——螺旋折线

         如图所示,切割螺旋线,并把它补成上图中的正方形,可以发现正方形的周长分别为8,16,24,32......为等差数列,每次都要从正方形的左下角开始顺时针绕圈。

        首先要计算出(X, Y)是第几圈,可以通过max(abs(X),abs(Y))来计算,dis(X, Y)  = 圈内所有正方形的长度+最外圈所走过的长度。

        求最外圈所走过的长度的时候,需要被y=x直线分成两部分讨论,如果点在y=x上面,先走一个边长到达正方形左上角的点(2*m),再通过(+x+y)实现从正方形左上角向右或向下移动,如果点在y=x下面,先走三个边长到达正方形右下角的点(3*2*m),再通过(-x-y)实现从正方形右下角向左或向上移动。对于在y=x上的点,要按照点在y=x下面来计算,如果按照点在y=x上面来计算的话,(X, Y) 是正方形左下角的时候,计算最外圈的时候结果为0,出现错误。


三、代码实现

#include <bits/stdc++.h>
using namespace std;

int main() {
	long long x, y, m; //不开long long可能会出错
	cin >> x >> y;
	m = max(abs(x), abs(y)); //求最外圈圈数
	long long ans = 0;
    //等差数列求内圈所有正方形长度和+最外圈走过的长度
	if (x < y) {
		ans = ( 4 + 4 * (m - 1)) * (m - 1) + 2 * m + x + y;
	} else {
		ans = ( 4 + 4 * (m - 1)) * (m - 1) + 2 * m * 3 - x - y;
	}
	cout << ans << endl;

	return 0;
}

加油哦! 如有错误和需要改进完善之处,欢迎大家纠正指教。

上一篇:集合


下一篇:Dijkstra(持续更新中···)