螺旋折線-C++


標題:螺旋折線ios

如圖p1.png所示的螺旋折線通過平面上全部整點剛好一次。
對於整點(X, Y),咱們定義它到原點的距離dis(X, Y)是從原點到(X, Y)的螺旋折線段的長度。 函數

例如dis(0, 1)=3, dis(-2, -1)=9 spa

給出整點座標(X, Y),你能計算出dis(X, Y)嗎?操作系統

【輸入格式】
X和Y code

對於40%的數據,-1000 <= X, Y <= 1000
對於70%的數據,-100000 <= X, Y <= 100000
對於100%的數據, -1000000000 <= X, Y <= 1000000000 blog

【輸出格式】
輸出dis(X, Y) 內存


【樣例輸入】
0 1ci

【樣例輸出】
3資源


資源約定:
峯值內存消耗(含虛擬機) < 256M
CPU消耗 < 1000ms編譯器


請嚴格按要求輸出,不要多此一舉地打印相似:「請您輸入...」 的多餘內容。

注意:
main函數須要返回0;
只使用ANSI C/ANSI C++ 標準;
不要調用依賴於編譯環境或操做系統的特殊函數。
全部依賴的函數必須明確地在源文件中 #include <xxx>
不能經過工程設置而省略經常使用頭文件。

提交程序時,注意選擇所指望的語言類型和編譯器類型。

 

 

 

解題思路:

 

 

 

 

 

 

 

實現代碼:

 1 #include<iostream>
 2 #include<algorithm>
 3 using namespace std;
 4 
 5 int main(){
 6     int x, y;
 7     int state = 0;  // 記錄該座標是否爲轉角座標
 8 
 9     cin >> x;
10     cin >> y;
11 
12     int x_original = x, y_original = y; //記錄原始座標
13 
14 
15     // 若是是處於轉角的點
16     if(abs(x) == abs(y) || (x < 0 && y <= 0 && x + 1 == y))
17     {
18         ;
19     }
20     else{
21         state = 1;
22         // 找到該座標所對應的區域,並找到 相應的對角座標
23         if(y > 0 && y > abs(x)){
24             x = -y;
25         }
26         else if(x > 0 && x > abs(y)){
27             y = x;
28         }
29         else if(y > 0 && x > y && x < 0){
30             y = x + 1;
31         }
32         else{
33             x = -y;
34         }
35     }
36 
37     int step;
38     // 計算出該座標所對應的步數 step
39     if(x > 0){
40         if(x == y) step = 3 + (abs(x) - 1) * 4;
41         else step = 4 + (abs(x) - 1) * 4;
42     }
43     else{
44         if(abs(x) == abs(y)) step = 2 + (abs(x) - 1) * 4;
45         else step = 1 + (abs(x) - 1) * 4;
46     }
47 
48     int sum;
49     int n = step / 2;
50     if(step % 2 == 0) sum = (2 + 2 * n) * n / 2;
51     else sum = (2 + 2 * n) * n / 2 + n + 1;
52 
53     //若是輸入的點不是轉角點,則加上原來的點到轉角的點的距離
54     if(state) sum += abs(x_original - x) + abs(y_original - y);
55 
56     cout << sum;
57     return 0;
58 }
相關文章
相關標籤/搜索