螺旋队列

参考: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 发表评论

posted on 2012-04-15 16:44  cokecoffe  阅读(478)  评论(0编辑  收藏  举报

导航