1. 程式人生 > >C程式--第九屆藍橋杯--螺旋折線

C程式--第九屆藍橋杯--螺旋折線


標題:螺旋折線

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

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

 

#include<stdio.h>
int s=0;
int lx(int x,int y,int s)
{
    if (x==0&&y==0) return s; //遞迴走到原點,返回S; 
    
    //螺旋線分為四種情況 ,每走一步判斷一次,S+1 ,迴圈遞迴 
    if (y>=-x&&y<x) return lx(x,y+1,s+1);// 原點右邊的線 
    if (y>=x&&y>-x) return lx(x-1,y,s+1);// 原點上面的線 
    if (y<=-x&&y>x+1) return lx(x,y-1,s+1);//原點左邊的線
    if (y<=x+1&&y<-x) return lx(x+1,y,s+1);//原點下面的線
}
int main()
{
    int x,y,i,j;
    scanf ("%d %d",&x,&y);//輸入座標點 
    
    s=lx(x,y,0);//呼叫函式 

    printf ("x=%d,y=%d,s=%d",x,y,s);
    return 0;