螺旋佇列問題解法

2021-05-01 07:59:16 字數 1436 閱讀 2130

看到這個怪圖了嗎?

對,就是螺旋佇列!

看清以上數字排列的規律,設

1 點的座標是

(0,0),x

方向向右為正,

y 方向向下為正。例如,

7 的座標為

(-1,-1),2

的座標為

(1,0),3

的座標為

(1,1)

。程式設計實現輸入任意一點座標

(x,y)

,輸出所對應的數字。[

finland

某著名通訊裝置公司

2005

年面試題]

規律是什麼?規律真的一看就能看出來,問題就在於如何利用它。很明顯這個佇列是順時針螺旋向外擴充套件的,我們可以把它看成一層一層往外延伸。第

0 層規定為中間的那個1,第

1 層為2 到

9,第2 層為

10 到

25,……好像看出一點名堂來了?注意到1、

9、25、……不就是平方數嗎?而且是連續奇數(1、

3、5、……)的平方數。這些數還跟層數相關,推算一下就可以知道第

t 層之內一共有

(2t-1)^2

個數,因而第

t 層會從

[(2t-1)^2] + 1

開始繼續往外螺旋。

知道了層數,接下來就好辦多了,這時我們就知道所求的那點一定在第

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

其實還有一點很重要,東線的判斷放在最後(其實只需要放在北線之後就可以),這樣一來,東北角那點始終會被認為是北線上的點啦~

所以,可以編寫**如下計算:

結束#

螺旋佇列問題

下面是乙個螺旋佇列 73 74 75 76 77 78 79 80 8172 43 44 45 46 47 48 4950 71 42 21 22 23 24 2526 51 70 41 20 7 8 910 27 52 69 40 19 6 1 2 11 28 53 68 39 18 5 4 3 ...

螺旋佇列問題

問題1 看清以下數字排列的規律,設1點的座標是 0,0 x方向向右為正,y方向向下為正,例如,7的座標為 1,1 2的座標為 1,0 3的座標為 1,1 程式設計實現輸入任意一點座標 x,y 輸出所對應的數字。21 22 20 7 8 9 10 19 6 1 2 11 18 5 4 3 12 17 ...

螺旋矩陣 解法

void fun1 else if up right else int sum 0 將現在數值的外面每一層的數值都加起來 if n 2 0 for int k 0 k max level level k sum 8 max level k 4 else for int k 0 k max level...