螺旋隊列算法分析

螺旋隊列的樣子如下圖:

 

  

 

兩大規律:

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 <iostream>
#include <string>

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 t = max(abs(x),abs(y));
int vc = (t*2+1)*(t*2+1);
int u;

if ( y == -t) //分別判斷,點落在該圈4條邊的哪條邊上
     u = vc+(x+y);
else if (x == -t)
    u = vc+(3*x-y);
else if (y == t)
     u = vc + (-x - 5*y);
else
     u = vc+(-7*x+y);

return u;
}


int main()
{

int x,y;

cout << endl;

for(y=-5;y<=5;y++)
    {
      for(x=-5;x<=5;x++)
    printf("%5d",spiralval(x,y));
      
      printf("/n");

    }
cin.get();
return 0;
}

發佈了20 篇原創文章 · 獲贊 11 · 訪問量 9萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章