美文网首页
Gym - 100947G Square Spiral Sear

Gym - 100947G Square Spiral Sear

作者: Cyril1317 | 来源:发表于2017-02-14 18:43 被阅读0次

    题目大意

    科学家目前正在开发一种称为“方形螺旋搜索”的算法。该算法按以下顺序搜索存储器位置(也在图中示出):


    斜线右上方的取第二圈最大值点16(-2, 2) ,第一圈最大值点4(-1,1 )
    斜线左下方的取第二圈最大值点24(2,-2),第一圈最大值点8(-1,1)
    属于右上分块同一圈的其余点的步数就等于,该圈最大步数减去所求点(x1, y1)到最大步数点的距离。
    然后两个分块的处理上有些细节

    输入分析

    3
    1 0//此点属于右下-第一圈,步数最大值点4(-1,1),△x = |(-1)-1|=2,△y=|1-0|=1,此点步数=4-△x-△y=1
    1 1
    -2 1//此点属于左下-第二圈,步数最大值点24(2, -2),△x= |(-2)-2|=4,△y=|-2-1|=3,此点步数=24-△x-△y=17
    

    代码分析

    #include <stdio.h>
    #include <stdlib.h>
    
    int main()
    {
        int t;
        long long x, y, st, xx, yy, res;
        scanf("%d", &t);
        while(t--)
        {
            scanf("%lld%lld", &x, &y);
            xx = abs(0-x);  
            yy = abs(0-y);
            st = max(xx, yy); //选出x,y中大的数字确认该点位于第st圈
            if (x + y == 0) //该点在线上
            {
                if (x >= 0) res = (2*st+1)*(2*st+1)-1;//属于左下段
                else res = (2*st)*(st*2);//属于右上段
            }
            else if (x+y > 0) //该点位于斜线右上方
            {
                res = (2*st)*(st*2);//该圈中步数的最大值
                res = res - abs(x+st) - abs(st-y); //求出该点位置
            }
            else
            {
                res = (2*st+1)*(2*st+1)-1;
                res = res - abs(x-st) - abs(st+y);
            }
            printf("%lld\n", res);
        }
        return 0;
    }
    

    ps

    这题数据范围
    - 1, 000, 000, 000 ≤ X ≤ 1, 000, 000, 000

    - 1, 000, 000, 000 ≤ Y ≤ 1, 000, 000, 000
    不能用int 要用long long

    相关文章

      网友评论

          本文标题:Gym - 100947G Square Spiral Sear

          本文链接:https://www.haomeiwen.com/subject/voffwttx.html