2018年第九屆藍橋杯省賽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 <xxx>
不能通過工程設置而省略常用頭文件。

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

 

思路:

找角的點的規律   , 從右上角開始  , 藍色的是4*x^2 或者 4*y^2, 綠色  和  紫色通過藍色推出來

分成四個區間,分別判斷

#include <iostream>
using namespace std;
int main()
{
    int x,y,dis;
    cin>>x>>y;
    if(x>=0&&y>=0)              //第一區間
    {
        if(x>=y)
            dis=4*x*x+x-y;
        else
            dis=4*y*y+x-y;
    }
    else if(x>=0&&y<=0)         //第四區間
    {
        if(x>=-y)
            dis=4*x*x+x-y;
        else
            dis=4*y*y-3*y-x;
    }
    else if(x<=0&&y>=0)         //第二區間
    {
        if(x>=-y)
            dis=4*y*y+x-y;
        else
            dis=4*x*x+3*x+y;
    }
    else if(x<=0&&y<=0)         //第三區間
    {
        if(y>=x+1)
            dis=4*x*x+3*x+y;
        else
            dis=4*y*y-3*y-x;
    }
    cout<<dis<<endl;
    return 0;
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章