1. 程式人生 > >藍橋杯——螺旋折線

藍橋杯——螺旋折線

第七題:螺旋折線

如圖所示的螺旋折線經過平面上所有整點恰好一次。 對於整點(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 螺旋折線 {

	/**
	 * @param args
	 */
	static int sum=0;
	static int dir[][]={{0,1},{1,0},{0,-1},{-1,0}};
	public static void main(String[] args) {
		Scanner sc=new Scanner(System.in);
		String s[]=sc.nextLine().split("\\s+");
		int x=Integer.valueOf(s[0]);
		int y=Integer.valueOf(s[1]);
		int xs=-1;
		int ys=0;
		int f=0;
		for (;;) {
			xs=xs+dir[f][0];
			ys=ys+dir[f][1];
			sum++;
			if(xs==x && ys==y){
				break;
			}
			if(xs<0 && ys<0){
				if(Math.abs(ys)*2==Math.abs(xs)){
					f=(f+1)%4;
				}
			}else {
				if(Math.abs(ys)==Math.abs(xs)){
					f=(f+1)%4;
				}
			}
		}
		System.out.println(sum+1);
	}

}