1. 程式人生 > >第九屆藍橋杯省賽 (7) -- 螺旋折線

第九屆藍橋杯省賽 (7) -- 螺旋折線


標題:螺旋折線

如圖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 <xxx>
不能通過工程設定而省略常用標頭檔案。

提交程式時,注意選擇所期望的語言型別和編譯器型別。
 

思路:把圖都當做若干個正方形巢狀。max(abs(a),abs(b))為第n個正方形,周長為 8*n。總長等於內嵌的所有正方形的周長總和,再加上該點在此正方形的長度之和,通過分類四條邊來計算其值,注意正方形左下角的點歸於第四條邊。。

#include<stdio.h>
#include<stdlib.h>
#define maxabs(a,b) (abs(a)>abs(b)?abs(a):abs(b))
long long sum(long x,long y) {
	long n = maxabs(x,y);
	long long sum = 4*n*(n-1); // 裡面的正方形邊長
	if(x==0 && y==0) return 0; 
	else if(x == -n && y != -n)
	{
		sum += (y+n);
	}
	else if(y == n) {
		sum += 2*n+(x+n); 
	}
	else if(x == n) {
		sum += 4*n+(n-y);
	}
	else {
		sum += 6*n+(n-x);
	}
	return sum;
}
int main() {
	int a,b;
	scanf("%d %d",&a,&b);
	printf("%d",sum(a,b));
}

總結:abs函式屬於#include <stdlib.h>標頭檔案中