打印2D图案

时间:2016-06-14 11:11:56

标签: algorithm loops

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

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)等等至NxN矩阵。

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

更新:再添加一行和列

2 个答案:

答案 0 :(得分:4)

似乎一般规则如下:

给定位置为元组(n,m),下一个位置是

  • (n + 1,0),如果 n = m
  • (m,n),如果 n>米
  • (m,n + 1),如果 n<米

在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