一 n維蛇形矩陣構建

2022-09-08 03:15:10 字數 4583 閱讀 2765

一、基礎版的蛇形方陣,如下圖所示:

思路:

我們先構建乙個n*n的矩陣dp(列表),然後用0填充,初始值 value = 1,然後value += 1更新值,將value填入到每乙個位置。對於上圖所示,我們發現元素在每乙個圈都是以順時針列印,那麼可以將每乙個圈設定為乙個迴圈。對於乙個外圈,可以看到它是從左到右,從上到下,從右到左,從下到上的順序遞增值。先設定4個方向的界限,如圖所示。

從左到右,此時行的下標值不變,為up值,列的下標值從 left 加到 right-1( 即for i in range(right +1) ) ,此時發生了什麼事呢,我們第一行已經完成了,那麼上界限up的需要往下移動一行,即 up+1,如果上界的值加到比下界的值down要大,說明此時整個表已經完成了,因此up>down 作為跳出整個填充dp的條件,即break。

從上到下,此時列的下標值不變,為right值,行的下標值從up(此時是第二行,上一步up已經+1)加到down,結束後該列(第right列)填充完成,right的值減1,如果right < left,break。

從右到左,此時行的下標值不變,為down值,列的下標值從right減到left,結束後該行(第down行)填充完成,down的值減1,如果down < up,break。

從下到上,此時列的下標值不變,為left值,行的下標值從down減到up,結束後該列(第left列)填充完成,left的值加1,如果left > right,break。

接下來第二圈是一樣的,while迴圈就可以了。

**:

1 n = 7  #

當然,可以指定其他的維度

2 num = 7**2

3 left = 0 #

左邊界4 rigth = n - 1 #

右邊界5 up = 0 #

上邊界6 down = n - 1 #

下邊界7 value = 1 #

初始值8

9 dp = [[0]*n for _ in

range(n)]

1011

while 1:

12for i in range(left, rigth + 1): #

從左到右

13 dp[up][i] =value

14 value += 1

15 up += 1 #

列印了這一行,上邊界減一

16if up >down:

17break

1819

for i in range(up, down + 1): #

從上到下

20 dp[i][rigth] =value

21 value += 1

22 rigth -= 1

23if rigth

24break

2526

for i in range(rigth, left - 1, -1): #

從右到左

27 dp[down][i] =value

28 value += 1

29 down -= 1

30if down

31break

3233

for i in range(down, up - 1, -1): #

從下到上

34 dp[i][left] =value

35 value += 1

36 left += 1

37if left >rigth:

38break

3940

from numpy import *

41print(mat(dp))

輸出:

[[ 1  2  3  4  5  6  7]

[24 25 26 27 28 29 8]

[23 40 41 42 43 30 9]

[22 39 48 49 44 31 10]

[21 38 47 46 45 32 11]

[20 37 36 35 34 33 12]

[19 18 17 16 15 14 13]]

二、變化版

這個形狀可以發現第一圈是順時針,第二圈是逆時針,第三圈又是順時針,這樣的話,我們可以將兩圈看作是乙個迴圈,不過在賦值的時候注意下標的位置。

**:

1 n = 7  #

當然,可以指定其他的維度

2 num = 7**2

3 left = 0 #

左邊界4 rigth = n - 1 #

右邊界5 up = 0 #

上邊界6 down = n - 1 #

下邊界7 value = 1 #

初始值8

9 dp = [[0]*n for _ in

range(n)]

1011

while 1:

12for i in range(left, rigth + 1): #

從左到右

13 dp[up][i] =value

14 value += 1

15 up += 1 #

列印了這一行,上邊界減一

16if up >down:

17break

1819

for i in range(up, down + 1): #

從上到下

20 dp[i][rigth] =value

21 value += 1

22 rigth -= 1

23if rigth

24break

2526

for i in range(rigth, left - 1, -1): #

從右到左

27 dp[down][i] =value

28 value += 1

29 down -= 1

30if down

31break

3233

for i in range(down, up - 1, -1): #

從下到上

34 dp[i][left] =value

35 value += 1

36 left += 1

37if left >rigth:

38break

3940

for i in range(up, down + 1): #

從上到下

41 dp[i][left] =value

42 value += 1

43 left += 1

44if rigth

45break

4647

48for i in range(left, rigth + 1): #

從左到右

49 dp[down][i] =value #注意此時的下標

50 value += 1

51 down -= 1

52if up >down:

53break

5455

for i in range(down, up - 1, -1): #

從下到上

56 dp[i][rigth] =value

57 value += 1

58 rigth -= 1

59if left >rigth:

60break

6162

for i in range(rigth, left - 1, -1): #

從右到左

63 dp[up][i] =value

64 value += 1

65 up += 1

66if down

67break

6869

from numpy import *

70print(mat(dp))

輸出:

#這裡生成了7維的方陣,可以根據需求設定

[[ 1 2 3 4 5 6 7]

[24 25 40 39 38 37 8]

[23 26 41 42 43 36 9]

[22 27 48 49 44 35 10]

[21 28 47 46 45 34 11]

[20 29 30 31 32 33 12]

[19 18 17 16 15 14 13]]

騰訊2016實習筆試 n階蛇形矩陣

題目描述 輸入乙個整數n,從上到下 從左到右列印n階蛇形矩陣。例如輸入整數4,輸出為 1 2 3 4 12 13 14 5 11 16 15 6 10 9 8 7 分析 生成乙個n階初始值為0的矩陣,從 0 0 位置開始依次向右 向下 向上 向左移動,每移動一次,填充乙個自增1的數。移動方向變化的條...

基礎題目 n階蛇形斜槓矩陣 陣列

假期無聊,寫了一下基礎題目,斜槓矩陣。這個具體的思路,我也不知道如何解釋,雙向與單向只是多了乙個變數控制,思路簡單來說就是找到他不變的量與相等量。具體看以下 include include include include using namespace std const int maxn 1e3 ...

矩陣化一維

矩陣化一維 字首和思想 for ri i 1 i n i for ri j 1 j m j view code 應用 題目 小 f 很喜歡數學,但是到了高中以後數學總是考不好。有一天,他在數學課上發起了呆 他想起了過去的一年。一年前,當他初識演算法競賽的 時候,覺得整個世界都煥然一新。這世界上怎麼會...