09届蓝桥杯B组第7题_螺旋折线


标题:螺旋折线

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

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值