螺旋折线
一、题目内容
题目描述
如图所示的螺旋折线经过平面上所有整点恰好一次。对于整点(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)
样例输入
0 1
样例输出
3
二、思路分析
如图所示,切割螺旋线,并把它补成上图中的正方形,可以发现正方形的周长分别为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;
}
加油哦! 如有错误和需要改进完善之处,欢迎大家纠正指教。