螺旋隊列
參考: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);
}
}
posted on 2012-04-15 16:44 Wangkeke 閱讀(1382) 評論(0) 編輯 收藏 引用 所屬分類: C