螺旋矩陣的python非遞迴實現

2021-09-26 05:07:59 字數 2660 閱讀 9075

螺旋矩陣是一道經典的程式題,看到多數的解決方案是用遞迴方法,但是如果對遞迴不熟悉,可能比較難想清楚程式邏輯,下面提供一種常規方法:

首先看題目:

'''

輸入n, 列印 n*n 螺旋矩陣

比如 n = 3,列印:

1 2 3

8 9 4

7 6 5

n = 4,列印:

1 2 3 4

12 13 14 5

11 16 15 6

10 9 8 7

'''

這篇文章介紹的方法是找規律,把乙個矩形陣列想象成由乙個具有多個節點的棍子構成,暫且稱為」多截棍「。我們按照螺旋的順序展開,也就是把矩陣變成乙個長為nn,從1排列到nn的列表,寫出每乙個數字對應的索引,可以發現具有以下規律:

number:1  - x:0;y:0

number:2 - x:0;y:1

number:3 - x:0;y:2

number:4 - x:0;y:3

number:5 - x:1;y:3

number:6 - x:2;y:3

number:7 - x:3;y:3

number:8 - x:3;y:2

number:9 - x:3;y:1

number:10 - x:3;y:0

number:11 - x:2;y:0

number:12 - x:1;y:0

number:13 - x:1;y:1

number:14 - x:1;y:2

number:15 - x:2;y:2

number:16 - x:2;y:1

#即x為最小值,y小於最大值時,y加1直到y為最大值,此時x最小值加1;

#y為最大值,x小於最大值時,x加1直到x為最大值,此時y最大值減1;

#x為最大值,y大於最小值時,y減1直到y為最小值,此時x最大值減1;

#y為最小值,x大於最小值時,x減1直到x為最小值,此時y最小值加1.

規律找出來後,直接上**:

def luoxuan(n):

#x,y,maxx,maxy,minx,miny初始化

x = 0

y = 0

maxx = n-1

maxy = n-1

minx = 0

miny = 0

xy_list = [[x,y]]

#n=0 和n=1的特例

if n == 0:return 0

if n == 1:return 1

#開始迴圈

while len(xy_list) < n*n:

if (x == minx) and (yminy):

y-=1

if y == miny:

maxx-=1

elif (x>minx) and (y == miny):

x-= 1

if x == minx:

miny+=1

#print('x:%d;y:%d'%(x,y))

table = [[0]*n for i in range(n)]

for i,b in enumerate(xy_list):

#print(b)

table[b[0]][b[1]] = i+1

print('number:%d - x:%d;y:%d'%(table[b[0]][b[1]],b[0],b[1]))

return table

luoxuan(4)

"'output:

number:1 - x:0;y:0

number:2 - x:0;y:1

number:3 - x:0;y:2

number:4 - x:0;y:3

number:5 - x:0;y:4

number:6 - x:1;y:4

number:7 - x:2;y:4

number:8 - x:3;y:4

number:9 - x:4;y:4

number:10 - x:4;y:3

number:11 - x:4;y:2

number:12 - x:4;y:1

number:13 - x:4;y:0

number:14 - x:3;y:0

number:15 - x:2;y:0

number:16 - x:1;y:0

number:17 - x:1;y:1

number:18 - x:1;y:2

number:19 - x:1;y:3

number:20 - x:2;y:3

number:21 - x:3;y:3

number:22 - x:3;y:2

number:23 - x:3;y:1

number:24 - x:2;y:1

number:25 - x:2;y:2

[[1, 2, 3, 4, 5],

[16, 17, 18, 19, 6],

[15, 24, 25, 20, 7],

[14, 23, 22, 21, 8],

[13, 12, 11, 10, 9]]

螺旋矩陣(python)

首先這類題我覺得不能想著如何去實現這個矩陣在 中,我們只需要用一些規律和代數去實現每個位置的數字即可 n,m int i for i in input split r,c int i for i in input split def abc n,m,i,j if i 1 return j if j ...

列印螺旋矩陣(遞迴解法)

求職過程遇到的一道面試題,當時沒有做出來,回來想出幾種方法,其中大多是 蠻力 解法,不得不陷入一堆的i j 迴圈之中。最後想出一種遞迴解法,現記錄如下。題目如下 輸入 n,列印 n n 螺旋矩陣 比如 n 3 列印 1 2 3 8 9 4 7 6 5 n 4 列印 1 2 3 4 12 13 14 ...

列印螺旋矩陣(遞迴解法)

求職過程遇到的一道面試題,當時沒有做出來,回來想出幾種方法,其中大多是 蠻力 解法,不得不陷入一堆的i j 迴圈之中。最後想出一種遞迴解法,現記錄如下。題目如下 輸入n,列印 n n 螺旋矩陣 比如 n 3,列印 1 2 3 8 9 4 7 6 5 n 4,列印 1 2 3 4 12 13 14 5...