參考:http://blog.csdn.net/yhmhappy2006/article/details/2934435
最近在看一些算法題,看到了螺旋隊(duì)列。開(kāi)始自己想了想,但是想到了一半,跟正確思路有些距離,感覺(jué)是跟每一圈的最大數(shù)有關(guān)系的公式。看了正確答案后發(fā)現(xiàn)確實(shí)如此。整理一下思路:
1.首先要判斷給出的坐標(biāo)(x,y)來(lái)計(jì)算出坐標(biāo)所屬的圈c。
2.算出當(dāng)前圈的最大的數(shù)max,可以根據(jù)這個(gè)數(shù)來(lái)推導(dǎo)給出坐標(biāo)的值的關(guān)系。
3.計(jì)算出每個(gè)邊的基準(zhǔn)值(base)與最大值的關(guān)系,即每個(gè)邊上的中間的那個(gè)數(shù)。
4.根據(jù)給出的坐標(biāo),判斷它是屬于(上、下、左、右邊)哪個(gè)邊的。然后推導(dǎo)這個(gè)數(shù)(value)與基準(zhǔn)值和(x,y)坐標(biāo)的關(guān)系。

下面得出每條邊的值,首先考慮上邊和下邊,這2條邊,在基準(zhǔn)值的基礎(chǔ)上,由x坐標(biāo)控制增減,因此:
?
topValue=topBase+x=max+y+x(上邊,隨x贈(zèng)而贈(zèng),因此是加x)
bottomValue=bottomBase-x=max-5y-x(下邊,隨x贈(zèng)而減,因此是減x)
同理,左邊和右邊,則在基準(zhǔn)值的基礎(chǔ)上,由y坐標(biāo)控制增減,因此:
leftValue=leftBase-y=max+3x-y(左邊,隨y贈(zèng)而減,因此是減y)
rightValue=rightBase+y=max-7x+y(右邊,隨y贈(zèng)而贈(zèng),因此是加y)
private static Object spiral(int x, int y)
{
int c = max(abs(x), abs(y));// 當(dāng)前坐標(biāo)所在圈
int max = (c * 2 + 1) * (c * 2 + 1);// 當(dāng)前圈上最大值
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);
}
}