螺旋矩陣 之二

2022-03-05 18:14:05 字數 3520 閱讀 7291

問題

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 代表有...