問題
1 按順時針方向構建(或螺旋訪問)乙個n * n的螺旋矩陣,效果見下圖。
2 在不構造螺旋矩陣的情況下,給定座標i、j值求其對應的值f(i, j)。
比如對6 * 6矩陣, f(2, 0) =19 f(2, 1) = 6
思路一
前一篇文章已經討論了一類螺旋矩陣(由外向內)
,而這一類螺旋矩陣,則是由內向外擴散。這兩類矩陣可以通過下面的方法相互轉換。
由於是 n * n矩陣,對座標(x,y)落在矩形的哪一條邊上,可以直接使用x <= y進行判斷,
原來的**
可以優化為:
intgetv(
intx,
inty,
intn)
//由外內向順時針螺旋
intk
=min(y, n -1
-x) +1
; return4*
k *(n -
k) +1-
(x +y -
(k -1)
*2);}
intgetv_in(
intx,
inty,
intn)
//由內向外順時針螺旋
思路二
將矩陣按1,1,2,2, … n-1,n-1, n 個數劃分成幾個矩形,比如:7*7矩陣(參考圖1):
(1)(2)(3 4)
(5 6)
這6個點構成矩形0
(7 8 9)
(10 11 12)
(13 14 15 16)(17 18 19 20)
構成矩形1
(21 22 23 24 25)(26 27 28 29 30)(31 32 33 34 35 36)(37 38 39 40 41 42)構成矩形2
(43 44 45 46 47 48 49)
構成矩形3的一條邊
若對第k(
k=0, 1, 2 …
)個矩形,起始點座標為
(i, i)
,則i + k = floor((n-1)/2)
其右上角頂點座標為(
i, i + 2 * k + 1
) 設 t = 2 * floor((n-1)/2) + 1 = (n - 1) | 1 則右上角頂點座標為:(i, t - i)
第k(k=0, 1, 2 …)個矩陣的4個頂點為(注意起始點不是左上角頂點而是(i, i)):
(i, i-1) ----------------------------------------- (i, t-i)
||||
||(t-i, i-1) ----------------------------------------- (t-i, t-i)
對給定的座標(x,y),如果它落在某個這類矩形上,顯然其所在的矩形起始點橫座標i滿足:
i = min
第k個矩形內的所有點構成(2*k+2)*(2*k+3)矩陣,共有元素p(k)=(2*k+2)*(2*k+3)
個,第k個矩形的起始點(i,i)對應的值為
t(i)=p(k-1)+1=2*k*(2*k+1)+1=(t-2*i)*(t-2*i-1)+1
對某個矩形,設矩形上的點(x, y)到起始點(i,i)的距離d = x-i + y-i = x+y-2*i,設點(x, y)到下一起始點(i-1,i-1)的距離為dd,則dd = d + 2
① 向右和向下都只是橫座標或縱座標增加1,這兩條邊上的點滿足f(x, y) = t(i) + d
② 向左和向下都只是橫座標或縱座標減少1,這兩條邊上的點滿足f(x, y) = t(i-1) –dd
對矩陣的構建和另一種螺旋矩陣類似,可參考**,
構建矩陣**:
}對給定座標求值的**:
intgetv(
intx,
inty,
intn)
//螺旋矩陣(由內向外擴散)
intk
=min(y +1
, t
-x) -1
;return
(t -2*
k) *
(t -2*
k -1)
+1-(x +y
-2*k);
}完整測試**:
**//
螺旋矩陣(由內向外擴散),給定座標直接求值 by flyinghearts
#include
<
iostream
>
#include
<
algorithm
>
using
std::min;
using
std::cout;
intgetv(
intx,
inty,
intn)
//螺旋矩陣(由內向外擴散)
intk
=min(y +1
, t
-x) -1
;return
(t -2*
k) *
(t -2*
k -1)
+1-(x +y
-2*k);
}int
main()
cout
<
"; }cout
<
";}}
輸出螺旋矩陣 二
輸出這樣的二維陣列 1 3 4 10 11 2 5 9 12 19 6 8 13 18 20 7 14 17 21 24 15 16 22 23 25 sub spiralmetrix byval n as integer n n 1 dim i as integer,j as integer,a ...
59 螺旋矩陣二 Python
題目 給定乙個正整數 n,生成乙個包含 1 到 n平方 所有元素,且元素按順時針順序螺旋排列的正方形矩陣。示例 輸入 3 輸出 1,2,3 8,9,4 7,6,5 思路 螺旋的給矩陣賦值。每到邊緣,變換遍歷方向。class solution object def generatematrix sel...
螺旋方針(螺旋矩陣)
螺旋方陣 time limit 1000ms memory limit 65536kb problem description 的螺旋方陣當n 5和n 3時分別是如下的形式 請給出乙個程式,對於任意的輸入 0 11 輸出按照上面規律所獲得的 的螺旋方陣。input 輸入第一行為整數 0 10 代表有...