如图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
不能通过工程设置而省略常用头文件。
提交程序时,注意选择所期望的语言类型和编译器类型。
一道模拟题,走的路径为左上右下,第一次左上右下分别为1,1,2,2,第二次左上右下分别为3,3,4,4,可见每一次都比上一次加了一个2.建两个变量dx,dy来表示当前位置,当这两个值等于输入的x,y时,则输出最终的步数。
代码:
import java.util.*;
import java.math.*;
public class Main {
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner cin=new Scanner(System.in);
int xx[]={-1,0,1,0};//初始化坐标,方便每次加
int yy[]={0,1,0,-1};
int left=1;//初始的四个方向
int up=1;
int right=2;
int down=2;
long x=cin.nextLong();
long y=cin.nextLong();
int dx=0;//当前位置
int dy=0;
int c;
int flag=0;
int count=0;//步数
if(dx==x&&dy==y)//如果一开始就相等,说明输入的xy在原点
{
System.out.println(0);
}
else
{
for(int i=0;i<=3;i++)
{
c=0;
if(i==0)//左
{
while(c<left)
{
dx+=xx[i];//当前坐标相应移动
dy+=yy[i];
count+=Math.abs(xx[i])+Math.abs(yy[i]);//加上移动的步数
if(dx==x&&dy==y)//加完之后再判断一下是不是到了我们想要到达的点
{
flag=1;
break;
}
c++;
}
if(flag==1)
break;
left+=2;//每次加2
}
if(i==1)
{
while(c<up)
{
dx+=xx[i];
dy+=yy[i];
count+=Math.abs(xx[i])+Math.abs(yy[i]);
if(dx==x&&dy==y)
{
flag=1;
break;
}
c++;
}
if(flag==1)
break;
up+=2;
}
if(i==2)
{
while(c<right)
{
dx+=xx[i];
dy+=yy[i];
count+=Math.abs(xx[i])+Math.abs(yy[i]);
if(dx==x&&dy==y)
{
flag=1;
break;
}
c++;
}
if(flag==1)
break;
right+=2;
}
if(i==3)
{
while(c<down)
{
dx+=xx[i];
dy+=yy[i];
count+=Math.abs(xx[i])+Math.abs(yy[i]);
if(dx==x&&dy==y)
{
flag=1;
break;
}
c++;
}
if(flag==1)
break;
down+=2;
}
if(i==3)//如果为3,而且还没有到达想要到的点,那么就再进行下一轮for循环
i=-1;
}
System.out.println(count);
}
}
}