9-7 螺旋折线Java


/*螺旋折线
如图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;
		}
	}
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值