螺旋折线

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


资源约定:
峰值内存消耗(含虚拟机) < 256M
CPU消耗  < 1000ms


请严格按要求输出,不要画蛇添足地打印类似:“请您输入...” 的多余内容。

注意:
main函数需要返回0;
只使用ANSI C/ANSI C++ 标准;
不要调用依赖于编译环境或操作系统的特殊函数。
所有依赖的函数必须明确地在源文件中 #include <xxx>
不能通过工程设置而省略常用头文件。

提交程序时,注意选择所期望的语言类型和编译器类型。
 

刚开始想去找规律,毕竟一看就是有某种规律在里边,但是发现特别乱,也没写出来,之后参考了别人的文章都是分方向写的,想起来dfs,后来发现加几个限制条件用循环就行,就根据自己的理解写了下,比较简单。

#include <sstream>
#include <iostream>
#include <algorithm>
#include <math.h>
using namespace std;
typedef long long LL;
LL X,Y;
LL d = 0,ans;

int check(int x,int y){
	if(x == X) return 1;
	else if(y == Y) return -1;
	else return 0;
}
int main(){
    cin >> X >> Y;
    if(X == 0 && Y == 0){
       cout << "0" << endl;
	   return 0;	
    }
    int x = 0,y = 0; 
    int res;
    while(x != X || y != Y){
    	
    	d++;
    	x = x-d;//向左 
    	y = y;
    	ans += d;
    	res = check(x,y);
    	if(res == 1){
    		ans += fabs(y - Y);
    		break;
    	}
    	
    	x = x;//向上 
    	y = y+d;
    	ans += d;
    	res = check(x,y);
    	if(res == -1){
    		ans += fabs(x - X);
    		break;
    	}
    	
    	d++;
    	x = x + d;//向右 
    	y = y;
    	ans += d;
    	res = check(x,y);
    	if(res == 1){
    		ans += fabs(y - Y);
    		break;
    	}
    	
    	x = x;//向下 
    	y = y - d;
    	ans += d;
    	res = check(x,y);
    	if(res == -1){
    		ans += fabs(x - X);
    		break;
    	}
    }
	cout << ans << endl;	     
    return 0;
}

应该是对的,不过没有用“蓝桥杯”练习系统测试(没有找到)