螺旋折线


题目

如下图所示的螺旋折线经过平面上所有整点恰好一次。

对于整点 (X,Y),我们定义它到原点的距离 dis(X,Y) 是从原点到 (X,Y)的螺旋折线段的长度。
例如 dis(0,1)=3,dis(−2,−1)=9
给出整点坐标 (X,Y),你能计算出 dis(X,Y)吗?
输入格式
包含两个整数 X,Y。
输出格式
输出一个整数,表示 dis(X,Y)。
数据范围
−109≤X,Y≤109
输入样例:
0 1
输出样例:
3

分析

这个题可以找规律来做


可以发现左上角的点都是等于2n(2n-1),n是表示第几圈,右上角的点都是(2n)(2n),
左下角的点是(2n-1) * (2n-1),右下角的是(2n) * (2n+1)

先判断是上下左右那个上面的,然后再找到这条边的起点是多少再加上偏移量

代码
#include<cmath>
#include<iostream>
using namespace std;
int main()
{
    int x,y;
    cin>>x>>y;
    if(abs(x)<=y)  //上面
    {
        int n=y;
        cout<<(long long)(2*n)*(2*n-1)+x+n<<endl;
    }
    else if(abs(x)<=abs(y)+1&&y<0)  //下面
    {
        int n=abs(y);
        cout<<(long long)(2*n)*(2*n+1)+n-x<<endl;
    }
    else if(abs(y)<=abs(x)&&x<0)  //左面
    {
        int n=abs(x);
        cout<<(long long)(2*n-1)*(2*n-1)+y-(-n+1)<<endl;
    }
    else if(abs(y)<=x)  //右面
    {
        int n=x;
        cout<<(long long)(2*n)*(2*n)+n-y<<endl;
    }
    return 0;
}

Author: 眼里有星星
Reprint policy: All articles in this blog are used except for special statements CC BY 4.0 reprint polocy. If reproduced, please indicate source 眼里有星星 !
 Previous
数列区间最大值 数列区间最大值
题目输入一串数字,给你 M 个询问,每次询问就给你两个数字 X,Y,要求你说出 X 到 Y这段区间内的最大数。输入格式第一行两个整数 N,M表示数字的个数和要询问的次数;接下来一行为 N个数;接下来 M行,每行都有两个整数 X,Y。输出格式
2020-02-23
Next 
数星星 数星星
题目天空中有一些星星,这些星星都在不同的位置,每个星星有个坐标。如果一个星星的左下方(包含正左和正下)有 k颗星星,就说这颗星星是 k级的。例如,上图中星星 5是 3 级的(1,2,4 在它左下),星星 2,4 是 1级的。例图中有 1个
2020-02-23
  TOC