首页 文章

打印2D图案

提问于
浏览
1

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

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矩阵 .

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

Update :再添加一行和一列

2 回答

  • 4

    似乎一般规则如下:

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

    • (n 1,0),如果n = m

    • (m,n),如果n> m

    • (m,n 1),如果n <m

    在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

    这是一个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
    

相关问题