/*螺旋折线
如图p1.pgn所示的螺旋折线经过平面上所有整点恰好一次。
对于整点(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
*/
import java.math.BigInteger;
import java.util.Scanner;
public class Demo_9_07 {
public static void main(String[] args) {
Scanner in=new Scanner(System.in);
int x=in.nextInt();
int y=in.nextInt();
long now=System.currentTimeMillis();
System.out.println(dislen(x,y));
System.out.println(System.currentTimeMillis()-now+"ms");
}
public static BigInteger dislen(int x,int y) {
int lulen=1; //向左向上都为1
int rdlen=2; //向右向下都为2
int sum=0;
int x1=0,y1=0; //原点为(0,0)
if(x==x1&&y==y1) {
return new BigInteger(sum+"");
}
/*输入的坐标不论正负,用设置的原点(0,0)逐步变化去接近输入的点,相等时退出
输入的坐标过大是,不断的循环相加,因为输入的坐标是不会变化的,所以原点总能追上
该坐标,也就是退出循环的条件*/
while(true) {
//先向左
for(int i=0;i<lulen;i++) {
if(x==x1&&y==y1) {
return new BigInteger(sum+""); //以大整数形式输出int型时,要在后面加
}
sum++;
x1--; //长度加一个,原点坐标也向目标移动一下
}
//再向上
for(int i=0;i<lulen;i++) {
if(x==x1&&y==y1) {
return new BigInteger(sum+"");
}
sum++;
y1++;
}
//然后向右
for(int i=0;i<rdlen;i++) {
if(x==x1&&y==y1) {
return new BigInteger(sum+"");
}
sum++;
x1++;
}
//最后向下
for(int i=0;i<rdlen;i++) {
if(x==x1&&y==y1) {
return new BigInteger(sum+"");
}
sum++;
y1--;
}
lulen+=2;
rdlen+=2;
}
}
}