厚积薄发,滴水穿石

搬家到主站了:http://www.cnblogs.com/cokecoffe/
随笔 - 45, 文章 - 8, 评论 - 12, 引用 - 0
数据加载中……

螺旋队列

参考: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);

}

}


posted on 2012-04-15 16:44 Wangkeke 阅读(1370) 评论(0)  编辑 收藏 引用 所属分类: C


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   博问   Chat2DB   管理