参考:http://blog.csdn.net/yhmhappy2006/article/details/2934435
最近在看一些算法题,看到了螺旋队列。开始自己想了想,但是想到了一半,跟正确思路有些距离,感觉是跟每一圈的最大数有关系的公式。看了正确答案后发现确实如此。整理一下思路:
1.首先要判断给出的坐标(x,y)来计算出坐标所属的圈c。
2.算出当前圈的最大的数max,可以根据这个数来推导给出坐标的值的关系。
3.计算出每个边的基准值(base)与最大值的关系,即每个边上的中间的那个数。
4.根据给出的坐标,判断它是属于(上、下、左、右边)哪个边的。然后推导这个数(value)与基准值和(x,y)坐标的关系。
下面得出每条边的值,首先考虑上边和下边,这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);
}
}