看到這個怪圖了嗎?
對,就是螺旋佇列!
看清以上數字排列的規律,設
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...