一、基礎版的蛇形方陣,如下圖所示:
思路:
我們先構建乙個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 很喜歡數學,但是到了高中以後數學總是考不好。有一天,他在數學課上發起了呆 他想起了過去的一年。一年前,當他初識演算法競賽的 時候,覺得整個世界都煥然一新。這世界上怎麼會...