螺旋折线

发布于 2018-04-03  841 次阅读


螺旋折线

如图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 
#include 
#include 

using namespace std;

int main(){
	int x, y, n, m, sum = 0, res = 0;
	cin >> n >> m;
	x = -max(abs(n), abs(m)); // 选绝对值最大的作为标志点 
	y = x;
	// 判断输入的点与标志点的位置 
	if(n == x)  
		res = m - y;
	else if(n == -x)  
		res = n - x + 2 * abs(y) + abs(y) - m;
	else if(m == y)
		res = 6 * abs(y) + abs(x) - n;
	else if(m == -y)
		res = 2 * abs(y) + n - x; 
	for(int i = 1; i < abs(x); i++) // 加上之前的每个完整的圈的步数 
		sum += i * 8;
	res += sum;
	if(m < 0 && m == n){ // 如果该店在标志点上时 
		res = 0;
		for(int i = 1; i <= abs(x); i++)
			res += i * 8;
	}
	cout << res << endl;
}