Построение магического квадрата нечетной размерности, Python

Метод Делаира или метод латинских квадратов

Суть метода
  1. Из целых чисел от 0 до n-1 строятся два латинских квадрата размерности n x n.

    Первая строка первого квадрата строится следующим образом:
    На первое место ставится число (n-1)/2, остальные числа занимают произвольные позиции.

    Каждая следующая строка строится из предыдущей, переносом каждого элемента на единицу вправо.
    Латинский квадрат 1
    Второй квадрат строится аналогично, только:

    Число (n-1)/2 ставиться на последнее место в первой строке.

    Каждая следующая строка строится из предыдущей переносом каждого элемента на единицу влево.
    Латинский квадрат 2
  2. Каждый элемент первого квадрата умножается на n, а к каждому элементу второго квадрата прибавляется 1.
    Латинские квадраты в итоге
  3. Затем, каждый элемент первого квадрата складывается с соответствующим ему элементом второго квадрата.

    В результате получается магический квадрат, заполненный числами от 1 до n^2.

    Магический квадрат
Реализация на Python
  1. Задается матрица, которая будет содержать первый латинский квадрат. И заполняется элементами от 0 до n-1.
  2. import numpy
    n=input('Please enter n: ')
    A=numpy.zeros([n,n])
    for i in range(n):
            A[i][i]=(n-1)/2
            for k in range(n):
                if k<(n-1)/2:
                    if i+k+1<n:
                        A[i][i+k+1]=k
                    else:
                        A[i][i+k+1-n]=k
                else:
                    if k==(n-1)/2:
                        pass
                    else:
                        if k+i<n:
                            A[i][i+k]=k
                        else:
                            A[i][i+k-n]=k

  3. Затем, задается вторая матрица, которая будет содержать магический квадрат.

    Каждый элемент магического квадрата будет получаться путем умножения соответствующего элемента первой матрицы на n, прибавления к результату умножения элемента с позицией n-1-k (где k — позиция нужного элемента той же строки) и прибавления к результату 1.
  4. B=numpy.zeros([n,n])
    for i in range(n):   
        for k in range(n):
            B[i][k]=A[i][k]*n+A[i][n-1-k]+1
  • avatar
  • 0

0 комментариев

Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.