螺旋佇列演算法分析轉

2021-07-04 05:39:52 字數 2016 閱讀 8158

1、螺旋規律

2、奇數(圈數,或x軸正座標)平方規律(紫線)每圈最大值max=(2*c+1)(2*c+1),c為由內往外的圈數,

c>=0

設1的座標是(0,0),x方向向右為正,y方向向下為正,例如,7的座標為(-1,-1),2的座標為(1,0)。程式設計實現輸入任意一點座標(x,y),輸出所對應的數字!

從紫線突破。

從圖中不難發現,每圈最大值max=(2*c+1)(2*c+1),c為由內往外的圈數,c>=0c從第0圈開始,如圖每圈最大值分別是1、9、25、49、81........,算出每圈的max後,就分4條邊分別計算每圈的其他值。通過座標落在該圈4條邊的哪條邊上,按照不同的公式計算出具體座標點的值。

以第3圈(max=49)為例,4條邊劃分如下圖(以顏色區分):

這裡先給出4條邊上各座標上的值與max的對應關係為:分別是1,3,5,7圈

上邊:topvalue=topbase+x=(max+y)+x

(上邊,隨x贈而贈,因此是加x)

左邊:leftvalue=leftbase-y=(max+3x)-y

(左邊,隨y贈而減,因此是減y)

下邊:bottomvalue=bottombase-x=max-5y-x

(下邊,隨x贈而減,因此是減x)

右邊:rightvalue=rightbase+y=(max-7x)+y

(右邊,隨y贈而贈,因此是加y)

那麼這些關係是怎麼得出來的呢?再看圖中畫上圈的數字(將其值表示為topbase,xxbase),我們稱其為每條邊的基準值:

觀察這些基準值與max值之間關係,不難發現,這些基準值與max之間的差分別是1c(上邊),3c(左邊),5c(下邊),7c(右邊)(c表示當前圈數),在上邊和下邊,y座標表示(或等於)圈數(即c=y),而在左邊和右邊,x座標表示(或等於)圈數(即c=x)。因此前面提到的差值又可用座標表示成1y,3x,5y,7x。因此就產生了各邊基準值的計算公式:

topbase=max+y

leftbase=max+3x

bottombase=max-5y

rightbase=max-7x

(注意座標的符號,負數加,正數減,因為基準值肯定都比max要小)

下面得出每條邊的值,首先考慮上邊和下邊,這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)

#include#include#include#includeusing namespace std;

inline int max(int a,int b)

int spiral(int x,int y)

else if(x==-c)//左邊

else if(y==c)//下邊

else if(x==c)//右邊 }

int main()

{ while(1)

{ cout>y;

cout<

**:

螺旋佇列演算法分析

螺旋佇列的樣子如下圖 兩大規律 1。螺旋規律 紅線 2。奇數平方規律 紫線 問題描述 設1的座標是 0,0 的方向向右為正,y方向向下為正,例如,7的座標為 1,1 2的座標為 0,1 程式設計實現輸入任意一點座標 x,y 輸出所對應的數字!問題解決 從紫線突破。從圖中不難發現,右上角vc 2 t ...

螺旋佇列演算法分析

螺旋佇列的樣子如下圖 兩大規律 1。螺旋規律 紅線 2。奇數平方規律 紫線 問題描述 設1的座標是 0,0 的方向向右為正,y方向向下為正,例如,7的座標為 1,1 2的座標為 0,1 程式設計實現輸入任意一點座標 x,y 輸出所對應的數字!問題解決 從紫線突破。從圖中不難發現,右上角vc 2 t ...

螺旋佇列演算法分析

1 螺旋規律 2 奇數 圈數,或x軸正座標 平方規律 紫線 設1的座標是 0,0 x方向向右為正,y方向向下為正,例如,7的座標為 1,1 2的座標為 1,0 程式設計實現輸入任意一點座標 x,y 輸出所對應的數字!從紫線突破。從圖中不難發現,每圈最大值max 2 c 1 2 c 1 c為由內往外的...