螺旋佇列演算法分析

2021-06-03 21:39:37 字數 2691 閱讀 2335

螺旋佇列的樣子如下圖:

兩大規律:

1。螺旋規律(紅線)

2。奇數平方規律(紫線)

問題描述:

設1的座標是(0,0),的方向向右為正,y方向向下為正,例如,7的座標為(-1,-1),

2的座標為(0,1)。程式設計實現輸入任意一點座標(x,y),輸出所對應的數字!

問題解決:

從紫線突破。從圖中不難發現,右上角vc=(2*t+1)(2*t+1),t為該圈x,y座標的絕對值的最大值。例如vc=9、25、49、81........,算出vc後,就分4個判斷區域,分別判斷,點落在該圈4條邊的哪條邊上,從而計算出具體座標點的值。

四個區域劃分如下圖:

4個區域內4條邊上的值u與vc的對應關係為:

y=-t區:u = vc+(x+y);

x=-t區:u = vc+(3*x-y);

y=t區:u = vc + (-x - 5*y);

x=t區:u = vc+(-7*x+y);

那麼這些關係是怎麼得出來的呢?再看圖中畫上圈的數字:

在y=-t區,y座標不變,x座標變化步長為1。令x=0,此時,u=vc+y作為該邊的基準值,其他值隨x的變化而變化,得在該區域u=vc+(x+y);

同理,在x=-t區,x座標不變,y座標變化步長為1。令y=0,此時,u=vc+3*x作為該邊的基準值,其他值隨y的變化而變化,得在該區域u=vc+(3*x-y);

同理得其他倆區域的表示式。不再贅述。

程式實現:

#include 

#include 

using

namespace std;

#define abs(a)    ((a)>0?(a):(-a))

#define max(a,b) ((a)>(b)?(a):(b))

int spiralval(int x,int y)

int main()

cin.get();

return 0;}

螺旋佇列

21 22 

23 24 

2520 

7  8 9 

10 19 

6  1

2 11

18 5  4 

3  12

17 16 

15 14 

13 看清以上數字排列的規律,設1點的座標是(0,0),x方向向右為正,y方向向下為正.例如:7的座標為(-1,-1) ,2的座標為(0,1),3的座標為(1,1).程式設計實現輸入任意一點座標(x,y),輸出所對應的數字。

解析:規律能看出來,問題就在於如何利用它。很明顯這個佇列是順時針螺旋向外擴充套件的,我們可以把它看成一層一層往外延 伸。第 0 層規定為中間的那個 1,第 1 層為 2 到 9,第 2 層為 10 到 25,注意到 1、9、25、……不就是平方數嗎?而且是連續奇數(1、3、5、……)的平方數。這些數還跟層數相關,推算一下就可以知道第 t 層之內一共有 (2t-1)^2 個數,因而第 t 層會從 [(2t-1)^2] + 1 開始繼續往外螺旋。給定座標 (x,y),如何知道該點處於第幾層?層數 t = max(|x|,|y|)。

知道了層數,接下來就好辦多了,這時我們就知道所求的那點一定在第 t 層這個圈上,順著往下數就是了。要注意的就是螺旋佇列數值增長方向和座標軸正方向並不一定相同。我們可以分成四種情況——上、下、左、右——或者——東、南、西、北,分別處於四條邊上來分析。

東|右:x == t,佇列增長方向和 y 軸一致,正東方向(y = 0)數值為 (2t-1)^2 + t,所以 v = (2t-1)^2 + t + y

南|下:y == t,佇列增長方向和 x 軸相反,正南方向(x = 0)數值為 (2t-1)^2 + 3t,所以 v = (2t-1)^2 + 3t - x

西|左:x == -t,佇列增長方向和 y 軸相反,正西方向(y = 0)數值為 (2t-1)^2 + 5t,所以 v = (2t-1)^2 + 5t - y

北|上:y == -t,佇列增長方向和 x 軸一致,正北方向(x = 0)數值為 (2t-1)^2 + 7t,所以 v = (2t-1)^2 + 7t + x

其實還有一點很重要,不然會有問題。其它三條邊都還好,但是在東邊(右邊)那條線上,佇列增加不完全符合公式!注意到東北角(右上角)是本層的最後乙個數,再往下卻是本層的第乙個數,那當然不滿足東線公式啊。所以我們把東線的判斷放在最後(其實只需要放在北線之後就可以),這樣一來,東北角那點始終會被認為是北線上的點。

答案:**如下:

#include

#define max(a,b) ((a)<(b)?(b):(a))

#define abs(a) ((a)>0?(a):-(a))

intfoo(intx

,inty)

intmain()

while(scanf("%d%d",&

x,&y) ==

2)

printf("%d\n"

,foo(x

,y));

return0;

}

螺旋佇列演算法分析

螺旋佇列的樣子如下圖 兩大規律 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為由內往外的...

螺旋佇列演算法分析

題目描述 設1的座標是 0,0 x方向向右為正,y方向向下為正,例如,7的座標為 1,1 2的座標為 1,0 程式設計實現輸入任意一點座標 x,y 輸出所對應的數字!有圖可知 每圈最大值max 2 c 1 2 c 1 c為由內往外的圈數,c 0。1為第0圈 上邊 utop max x y 左邊 ul...