标题:螺旋折线
如图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
请严格按要求输出,不要画蛇添足地打印类似:“请您输入...” 的多余内容。
所有代码放在同一个源文件中,调试通过后,拷贝提交该源码。
不要使用package语句。不要使用jdk1.7及以上版本的特性。
主类的名字必须是:Main,否则按无效代码处理。
代码如下:
import java.util.Scanner;
//螺旋折线
public class SpiralFoldLine {
public static void main(String[] args) {
//实例化Scanner对象
Scanner sc = new Scanner(System.in);
//接收用户输入的数据(X,Y)坐标
int x = sc.nextInt(), y = sc.nextInt();
//调用计算长度方法
System.out.println(ff(x, y));
}
public static int ff(int x, int y) {
// 要返回输出的长度
int cnt = 0;
// 原点坐标(由于要将给定的坐标回退到原点,所以定义一个原点坐标)
// 回退到原点坐标,是为了计算长度
int x1 = 0, y1 = 0;
// (特殊情况)当横纵坐标都为0时,即为原点,
if (x == 0 && y == 0) {
// 因为在原点,所以步数为零,直接返回长度(0)
return cnt;
}
/*(情况)一、当坐标点在X、Y坐标轴上时
(情况一,又分为四种,详细如下。(1,2,3,4,)标注)*/
//1.dis点在Y轴的正半轴
// 横坐标为0,纵坐标>0
else if (x == 0 && y > 0) {
for (int j = 3; j < 9999; j += 8) {
// 回到原点时,终止循环
if (y == y1) {
break;
} else {
cnt += j;
}
// 观察数据,看是否在一圈一圈回退
System.out.println("y纵大于零:" + y);
System.out.println(x);
System.out.println("y1:" + y1);
// 一圈一圈退回原点
y--;
}
}
// 2. dis点在Y轴的负半轴
// 横坐标为0,纵坐标<0
else if (x == 0 && y < 0) {
for (int j = 7; j < 9999; j += 8) {
// 回到原点时,终止循环
if (y == y1) {
break;
} else {
cnt += j;
}
// 观察数据,看是否在一圈一圈回退
System.out.println("y纵小于零:" + y);
System.out.println("y1:" + y1);
// 一圈一圈退回原点
y++;
}
}
// 3. dis点在X轴的正半轴
// 横坐标>0,纵坐标为0
else if (x > 0 && y == 0) {
for (int j = 5; j < 9999; j += 8) {
// 回到原点时,终止循环
if (x == x1) {
break;
} else {
cnt += j;
}
// 观察数据,看是否在一圈一圈回退
System.out.println("x横大于零:" + x);
System.out.println("x1:" + x1);
// 一圈一圈退回原点
x--;
}
}
// 4. dis点在X轴的负半轴
// 横坐标<0,纵坐标为0
else if (x < 0 && y == 0) {
for (int j = 1; j < 9999; j += 8) {
// 回到原点时,终止循环
if (x == x1) {
break;
} else {
cnt += j;
}
// 观察数据,看是否在一圈一圈回退
System.out.println("x横小于零:" + x);
System.out.println("x1:" + x1);
// 一圈一圈退回原点
x++;
}
}
// (情况)二、当坐标点在一二三四象限内时
// 1. dis点在第一象限
// 横坐标>0,纵坐标>0
else if (x > 0 && y > 0) {
// 差
int tmp = x - y;
// 横坐标>纵坐标
if (x > y) {
// 第一象限的角平分线
for (int j = 4; j < 9999; j += 8) {
// 回到原点时,终止循环
if (x == x1) {
cnt += tmp;
break;
} else {
cnt += j;
}
// 观察数据,看是否在一圈一圈回退
System.out.println("第一象限,x>Y时,x:" + x);
System.out.println("第一象限,x>Y时,x1:" + x1);
// 一圈一圈退回原点
x--;
}
}
// 横坐标<纵坐标
else if (x < y) {
// 差
int tmp2 = x - y;
// 第一象限的角平分线
for (int j = 4; j < 9999; j += 8) {
// 回到原点时,终止循环
if (y == y1) {
cnt += tmp2;
break;
} else {
cnt += j;
}
// 观察数据,看是否在一圈一圈回退
System.out.println("第一象限,x<Y时,y:" + y);
System.out.println("第一象限,x<Y时,y1:" + y1);
// 一圈一圈退回原点
y--;
}
} else {
for (int j = 4; j < 9999; j += 8) {
// 回到原点时,终止循环
if (x == x1) {
break;
} else {
cnt += j;
}
// 观察数据,看是否在一圈一圈回退
System.out.println("第一象限,x=Y时,x:" + x);
System.out.println("第一象限,x=Y时,x1:" + x1);
// 一圈一圈退回原点
x--;
}
}
}
// 2. dis点在第二象限
// 横坐标>0,纵坐标<0
else if (x > 0 && y < 0) {
// 横坐标>纵坐标(要用他俩的绝对值来比较)(所以使用了Math.abs()函数)
if (Math.abs(x) > Math.abs(y)) {
// 第二象限的角平分线
for (int j = 5; j < 9999; j += 8) {
// 回到原点时,终止循环
if (x == x1) {
// Math.abs()是一个求绝对值的函数
cnt += Math.abs(y);
return cnt;
} else {
cnt += j;
}
// 观察数据,看是否在一圈一圈回退
System.out.println("第二象限,x>Y时,x:" + x);
System.out.println("第二象限,x>Y时,x1:" + x1);
// 一圈一圈退回原点
x--;
}
}
// 横坐标<纵坐标
else if (Math.abs(x) < Math.abs(y)) {
// 差
int tmp2 = Math.abs(y) - Math.abs(x);
int tmpy = Math.abs(y);
// 第二象限的角平分线
for (int j = 6; j < 9999; j += 8) {
// 回到原点时,终止循环
if (tmpy == y1) {
cnt += tmp2;
break;
} else {
cnt += j;
}
// 观察数据,看是否在一圈一圈回退
System.out.println("第二象限,x<Y时,tmpy:" + tmpy);
System.out.println("第二象限,x<Y时,y1:" + y1);
// 一圈一圈退回原点
tmpy--;
}
} else {
for (int j = 6; j < 9999; j += 8) {
// 回到原点时,终止循环
if (x == x1) {
break;
} else {
cnt += j;
}
// 观察数据,看是否在一圈一圈回退
System.out.println("第二象限,x=Y时,x:" + x);
System.out.println("第二象限,x=Y时,x1:" + x1);
// 一圈一圈退回原点
x--;
}
}
}
// 3. dis点在第三象限
// 横坐标<0,纵坐标<0
else if (x < 0 && y < 0) {
// 为了方便使用横纵坐标的绝对值,定义两个临时变量暂时存放他俩的绝对值
int tmpx = Math.abs(x), tmpy = Math.abs(y);
//差
int tmp = tmpx - tmpy - 1;
// 横坐标(的绝对值)>纵坐标(的绝对值)
if (tmpx > tmpy) {
for (int j = 9; j < 9999; j += 8) {
if (tmpx - 1 == x1) {
cnt -= tmp;
break;
} else {
cnt += j;
}
// 观察数据,看是否在一圈一圈回退
System.out.println("第三象限,tmpx>tmpy时,tmpx:" + tmpx);
System.out.println("第三象限,tmpx>tmpy时,x1:" + x1);
// 一圈一圈退回原点
tmpx--;
}
}
// 横坐标(的绝对值)<纵坐标(的绝对值)
else if (tmpx < tmpy) {
for (int j = 7; j < 9999; j += 8) {
if (tmpy == y1) {
cnt += tmpx;
break;
} else {
cnt += j;
}
// 观察数据,看是否在一圈一圈回退
System.out.println("第三象限,tmpx<tmpy时,tmpx:" + tmpx);
System.out.println("第三象限,tmpx<tmpy时,x1:" + x1);
// 一圈一圈退回原点
tmpy--;
}
}
// 横坐标(的绝对值)=纵坐标(的绝对值)
else {
for (int j = 8; j < 9999; j += 8) {
if (tmpx == x1) {
break;
} else {
cnt += j;
}
// 观察数据,看是否在一圈一圈回退
System.out.println("第三象限,tmpx=tmpy时,tmpx:" + tmpx);
System.out.println("第三象限,tmpx=tmpy时,x1:" + x1);
// 一圈一圈退回原点
tmpx--;
}
}
}
// 3. dis点在第四象限
// 横坐标<0,纵坐标>0
else if (x < 0 && y > 0) {
// 为了方便使用横纵坐标的绝对值,定义两个临时变量暂时存放他俩的绝对值
int tmpx = Math.abs(x), tmpy = Math.abs(y);
//差
int tmp = tmpx - tmpy;
int tmp2 = tmpy - tmpx;
// 横坐标(的绝对值)>纵坐标(的绝对值)
if (tmpx > tmpy) {
for (int j = 2; j < 9999; j += 8) {
if (tmpx == x1) {
cnt -= tmp;
break;
} else {
cnt += j;
}
// 观察数据,看是否在一圈一圈回退
System.out.println("第四象限,tmpx>tmpy时,tmpx:" + tmpx);
System.out.println("第四象限,tmpx>tmpy时,x1:" + x1);
// 一圈一圈退回原点
tmpx--;
}
}
// 横坐标(的绝对值)<纵坐标(的绝对值)
else if (tmpx < tmpy) {
for (int j = 2; j < 9999; j += 8) {
if (tmpy == y1) {
cnt += tmp2;
break;
} else {
cnt += j;
}
// 观察数据,看是否在一圈一圈回退
System.out.println("第四象限,tmpx>tmpy时,tmpx:" + tmpx);
System.out.println("第四象限,tmpx>tmpy时,x1:" + x1);
// 一圈一圈退回原点
tmpy--;
}
}
// 横坐标(的绝对值)=纵坐标(的绝对值)
else {
for (int j = 3; j < 9999; j += 8) {
if (tmpx == x1) {
break;
} else {
cnt += j;
}
// 观察数据,看是否在一圈一圈回退
System.out.println("第四象限,tmpx>tmpy时,tmpx:" + tmpx);
System.out.println("第四象限,tmpx>tmpy时,x1:" + x1);
// 一圈一圈退回原点
tmpx--;
}
}
}
// 返回长度(结束)
return cnt;
}
}