• 螺旋队列


    参考:http://blog.csdn.net/yhmhappy2006/article/details/2934435

    最近在看一些算法题,看到了螺旋队列。开始自己想了想,但是想到了一半,跟正确思路有些距离,感觉是跟每一圈的最大数有关系的公式。看了正确答案后发现确实如此。整理一下思路:

    1.首先要判断给出的坐标(x,y)来计算出坐标所属的圈c。

    2.算出当前圈的最大的数max,可以根据这个数来推导给出坐标的值的关系。

    3.计算出每个边的基准值(base)与最大值的关系,即每个边上的中间的那个数。

    4.根据给出的坐标,判断它是属于(上、下、左、右边)哪个边的。然后推导这个数(value)与基准值和(x,y)坐标的关系。

    1334250330 8408

    下面得出每条边的值,首先考虑上边和下边,这2条边,在基准值的基础上,由x坐标控制增减,因此:

     

    topValue=topBase+x=max+y+x(上边,随x赠而赠,因此是加x)

    bottomValue=bottomBase-x=max-5y-x(下边,随x赠而减,因此是减x)

    同理,左边和右边,则在基准值的基础上,由y坐标控制增减,因此:

    leftValue=leftBase-y=max+3x-y(左边,随y赠而减,因此是减y)

    rightValue=rightBase+y=max-7x+y(右边,随y赠而赠,因此是加y)

     

    private static Object spiral(int x, int y)

    {

    int c = max(abs(x), abs(y));// 当前坐标所在圈

    int max = (c * 2 + 1) * (c * 2 + 1);// 当前圈上最大值


    if (y -c)

    { // 上边

    return max + (x + y);

    }else if (x -c)

    {// 左边

    return max + (3 * x - y);

    } else if (y == c)

    {// 下边

    return max + (-x - 5 * y);

    }else

    { // 右边

    return max + (-7 * x + y);

    }

    }

     



    Wangkeke 2012-04-15 16:44 发表评论
  • 相关阅读:
    DP 免费馅饼 HDU1176
    知了课堂 Python Flask零基础 笔记整理
    Splay入门
    字典树
    榨取kkksc03 多维dp
    种族并查集总结
    倍增总结
    求最大公因数(辗转相除法&更相减损术)
    Bzoj 3036: 绿豆蛙的归宿(期望)
    Bzoj 1497: [NOI2006]最大获利(最小割)
  • 原文地址:https://www.cnblogs.com/cokecoffe/p/2537126.html
Copyright © 2020-2023  润新知