螺旋折線——第九屆藍橋杯C語言B組(省賽)第七題


原創


如圖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 
不能通過工程設置而省略常用頭文件。 
提交程序時,注意選擇所期望的語言類型和編譯器類型。

我的解題思路很簡單很直白,由於行駛軌跡已經固定,所以只要從原點開始沿着軌跡邊走邊判斷即可。

分為左/上/右/下四個方向按順序(行駛軌跡固定)行走,可以看到先向左1步、上1步、右2步、下2步;

然后左3步(+2)、上3步(+2)、右4步(+2)、下4步(+2);以后都是每次+2;我們每走一步就判

斷是否到終點。(代碼不夠簡練,如有錯誤,很歡迎指正)

 1 #include<stdio.h>
 2 #include<math.h>
 3 
 4 int xx[]={-1,0,1,0};    //左上右下
 5 int yy[]={0,1,0,-1};  6 
 7 int count;    //計數器 
 8 
 9 int left=1;    //4個方向初值 
 10 int up=1;  11 int right=2;  12 int down=2;  13 
 14 int main()  15 {  16     long long x,y;  17     scanf("%I64d%I64d",&x,&y);  18     
 19     int dx=0;  20     int dy=0;  21     int c=0;  22     int flag=0;    //標志 
 23     
 24     if( dx==x && dy==y )  25  {  26         printf("0");  27         return 0;  28  }  29         else
 30  {  31             int i;  32             for(i=0;i<=3;i++)  33  {  34                 c=0;  35                 if(i==0)    //
 36  {  37                     while(c<left)  38  {  39                         dx+=xx[i];  40                         dy+=yy[i];  41                         count+=fabs(xx[i])+fabs(yy[i]);    //加步數
 42                         if(dx==x && dy==y)    //走了以后判斷
 43  {  44                             flag=1;  45                             break;  46  }  47                         c++;  48  }  49                     if(flag==1)  50                         break;  51                     left+=2;    //步數+2 
 52  }  53                 if(i==1)    //
 54  {  55                     while(c<up)  56  {  57                         dx+=xx[i];  58                         dy+=yy[i];  59                         count+=fabs(xx[i])+fabs(yy[i]);  60                         if(dx==x && dy==y)  61  {  62                             flag=1;  63                             break;  64  }  65                         c++;  66  }  67                     if(flag==1)  68                         break;  69                     up+=2;  70  }  71                 if(i==2)    //
 72  {  73                     while(c<right)  74  {  75                         dx+=xx[i];  76                         dy+=yy[i];  77                         count+=fabs(xx[i])+fabs(yy[i]);  78                         if(dx==x && dy==y)  79  {  80                             flag=1;  81                             break;  82  }  83                         c++;  84  }  85                     if(flag==1)  86                         break;  87                     right+=2;  88  }  89                 if(i==3)    //
 90  {  91                     while(c<down)  92  {  93                         dx+=xx[i];  94                         dy+=yy[i];  95                         count+=fabs(xx[i])+fabs(yy[i]);  96                         if(dx==x && dy==y)  97  {  98                             flag=1;  99                             break; 100  } 101                         c++; 102  } 103                     if(flag==1) 104                         break; 105                     down+=2; 106  } 107                 if(i==3)    //再次相加
108                     i=-1; 109  } 110  } 111     printf("%d",count); 112     return 0; 113 }

09:49:11

2018-04-10


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM