2016-06-14 78 views
1

我发现了这种模式并决定打印它。这里打印2D模式

1 2 5 10 17 
3 4 7 12 19 
6 8 9 14 21 
11 13 15 16 23 
18 20 22 24 25 

规则是,从(0,0)移动到(0,1)到(1,0),(1,1)到(0,2)到(2,0)至( 1,2)到(2,1)到(2,2)等直到N×N矩阵。

我有一个非常复杂的方法来打印它。有没有简单的方法来打印这种模式?

更新:增加了一个行和列

+0

你是如何储存上述图案?它只是一个嵌套数组,列表或类似?你只是想要伪代码? – Draken

+0

我正在填充矩阵的最后一行和最后一列的元素,一旦我到达(N,N),我创建另外一行和一列,然后重复它。 – Mustafa

+0

将其存储在2d矩阵中。 – Mustafa

回答

4

这似乎是一般规则如下:

给定一个位置作为一个元组(N,M),下位置是

  • (N + 1,0),如果N = M
  • (M,N),如果N> M
  • (M,N + 1),如果Ñ<米

在Python:

def next_pos(n, m): 
    if n == m: return (n+1, 0) 
    if n > m: return (m, n) 
    if n < m: return (m, n+1) 

示例:

N = 5 
n, m = (0, 0) 
matrix = [[None for _ in range(N)] for _ in range(N)] 
for x in range(N*N): 
    matrix[m][n] = x+1 
    n, m = next_pos(n, m) 

结果:

1 2 5 10 17 
3 4 7 12 19 
6 8 9 14 21 
11 13 15 16 23 
18 20 22 24 25 
1

这里是第一个,每隔数延伸的每行从1开始超过最后完美的广场一个Python的解决方案,然后添加一个新行,其中包括所有其他号码开始2以上的最后一个完全平方,最后条目沿(其是该序列中的下一个完全平方):

def expandSquare(square): 
    n = len(square[0]) 
    for i, row in enumerate(square): 
     row.append(n**2 + 1 + 2*i) 
    square.append([k for k in range(n**2 + 2, (n+1)**2,2)] + [(n+1)**2]) 

def makeSquare(n): 
    square = [[1]] 
    for i in range(1,n): expandSquare(square) 
    return square 

def pprint(square): 
    print('\n'.join('\t'.join(str(i) for i in row) for row in square)) 

例如,

>>> pprint(makeSquare(5)) 
1 2 5 10 17 
3 4 7 12 19 
6 8 9 14 21 
11 13 15 16 23 
18 20 22 24 25