Волшебный квадрат – решите головоломку 3×3, используя C и Python Примеры

Что такое Магический квадрат?

Магический квадрат — это квадратная матрица со специальным расположением чисел. Эти числа расположены так, что сумма чисел на каждой диагонали, строке и столбце остается одинаковой. Игры «Магические квадраты» — это простые логические головоломки, используемые в развлекательной математике.

Пример магических квадратов:

Magic Square

На приведенной выше диаграмме приведен пример магического квадрата третьего порядка. Сумма каждой диагонали, строки и столбца равна 3.

Как работает Магический квадрат

Магические квадраты — это матрицы n*n, состоящие из n^2 целых положительных чисел. Количество строк или столбцов квадратной матрицы называется порядком матрицы.

Обычно головоломки с магическими квадратами имеют нечетный порядок и содержат целые числа от 1 до n^2. Сумма каждой диагонали, строки и столбца одинакова. Это число называется магической суммой или магической константой. Как правило, эта магическая сумма зависит от порядка матрицы. Формула магических квадратов для магической суммы порядка n:

Магический квадрат работает

Давайте возьмем пример магического квадрата с целыми числами 3. Итак, магическая сумма будет:

Магический квадрат работает

Магический квадрат работает

Почему их называют Магическими?

Древние математики были очарованы природой нескольких интересных комбинаций чисел. Магический квадрат был одним из них. Самые ранние свидетельства существования магических квадратов относятся к Китаю, датированному 190 годом до нашей эры.

Некоторые исследования свидетельствуют о существовании головоломки «Магические квадраты» в древней Японии, Индии и Аравии. На основании некоторых легенд предполагалось, что эти особые числовые образования были связаны с волшебным миром. Поэтому эти квадраты были названы магическими квадратами.

Виды магического квадрата

Существуют разные варианты математики магических квадратов –

  • Обычный магический квадрат: Этот тип магического квадрата содержит первые n^2 чисел.
  • Полумагический квадрат: В этом типе только строки и столбец суммируются до магической константы.
  • Простой магический квадрат: В отличие от предыдущего типа, сумма строк, столбцов и обеих диагоналей дает магическую константу.
  • Самый совершенный магический квадрат: Это обычный магический квадрат с двумя особыми свойствами. Здесь каждый подквадрат матрицы размером 2 на 2 в сумме дает 2(n^2+1). И любая пара чисел, которые находятся на расстоянии n/2 квадратов от суммы сетки до n^2+1.

По свойствам существует еще много типов магических квадратов. Но всякий раз, когда мы просто упоминаем магический квадрат, мы предполагаем, что это обычный и простой магический квадрат нечетного порядка.

Алгоритм создания магического квадрата

Алгоритм генерации магических квадратов нечетного порядка:

  • Первое число или 1 будет сохранено в (n/2, n-1), где первая координата — это позиция строки, а вторая координата — позиция столбца. Для дальнейших шагов давайте обозначим эту позицию как (x, y).
  • Следующие числа будут храниться в (x-1, y+1). Если позиция недействительна, то рассмотрим следующие условия.
    1. Если позиция строки равна -1, она изменится на n-1. Аналогично, если вычисленная позиция столбца равна n, она изменится на 0.
    2. Позиция строки будет увеличена на 1, а позиция столбца будет уменьшена на 2, если вычисленная позиция уже содержит число.
    3. Если позиция строки равна -1, а позиция соответствующего столбца равна n, новая позиция будет (0, n-2.

Примечание: Этот алгоритм генерирует действительные магические квадраты только нечетного порядка. Мы также считаем этот магический квадрат обычным магическим квадратом с первыми числами n^2. Более того, для одного и того же значения n может быть несколько решений.

Давайте возьмем пример и посмотрим, как это работает. Допустим, мы хотим найти магический квадрат третьего порядка. Поскольку это будет простой и обычный магический квадрат нечетного порядка, он будет содержать все числа от 3 до 1^3 или 2.

Как это работает?

По нашим алгоритм, шаги будут следующими:

Шаг 1) Первое число или 1 будет в позиции (3/2, 3-1) или (1, 2). По соглашению, для последующих шагов рассмотрим x= 1 и y= 2.

Алгоритм создания магического квадрата

Шаг 2) Позиция остальных чисел будет рассчитываться следующим образом:

Позиция номера 2:

Следующее число будет в позиции (x-1, y+1) или (0, 3), что не является допустимой позицией. При использовании условия (a) соответствующей допустимой позицией будет (0,0). Итак, х=0, у=0.

Алгоритм создания магического квадрата

Позиция номера 3:

Номер 3 будет в позиции (x-1, y+1) или (-1, 1), что не является допустимой позицией. При использовании условия (a) допустимой позицией строки будет n-1 или 2. Таким образом, номер 3 будет в (2, 1). Для следующего числа x= 2, y= 1.

Алгоритм создания магического квадрата

Позиция номера 4:

Номер 4 должен находиться в позиции (x-1, y+1) или (1, 2), что является допустимой позицией. Но эта позиция уже содержит номер. Согласно условию (b), допустимой позицией будет (1+1, 2-2) или (2,0). Для следующего числа x= 2, y= 0.

Алгоритм создания магического квадрата

Позиция номера 5:

Номер 5 должен находиться в позиции (x-1, y+1) или (1, 1), что является допустимой позицией. Для следующего числа x= 1, y= 1.

Алгоритм создания магического квадрата

Позиция номера 6:

Номер 6 должен находиться в позиции (x-1, y+1) или (0, 2), что является допустимой позицией. Для следующего числа x= 0, y= 2.

Алгоритм создания магического квадрата

Позиция номера 7:

Номер 7 должен находиться в позиции (x-1, y+1) или (-1, 3), что не является допустимой позицией. Согласно условию (c), допустимой позицией будет (0, n-2) или (0, 1). Для следующего числа x= 0, y= 1.

Алгоритм создания магического квадрата

Позиция номера 8:

Номер 8 должен находиться в позиции (x-1, y+1) или (-1, 2), что не является допустимой позицией. При использовании условия (a) допустимой позицией будет (2, 2). Для следующего числа x= 2, y= 2.

Алгоритм создания магического квадрата

Позиция номера 9:

Номер 9 должен находиться в позиции (x-1, y+1) или (1, 3), что не является допустимой позицией. При использовании условия (a) допустимой позицией будет (1, 0).

Алгоритм создания магического квадрата

Псевдо-код

Begin
	Declare an array of size n*n
	Initialize the array to 0
	Set row = n/2
	Set column = n-1
	For all number i: from 1 to n*n
		If the row = -1 and column = n
			row = 0
			column = n-2
		Else
			If row = -1
				row = n-1
			If column = n
				column = 0
		If the position already contains a number
			decrement column by 2
			increment row by 1
			continue until the position is not 0
		Else
			put the number i into the calculated position
			increment i		
		Increment column value
		Decrement row value
End		

C++ Код Магический квадрат

Входной сигнал:

/*
A C/C++ program for generating odd order magic squares
*/
#include <bits/stdc++.h>
using namespace std;

void GenerateMagicSquare(int n)
{
    int magic[n][n];
    //initializing the array
    for(int i=0; i<n; i++)
for(int j=0; j<n; j++)
	        magic[i][j] = 0;
    //setting row and column value
    int i = n / 2;
    int j = n - 1;
    for (int k = 1; k <= n * n;) 
    {
//checking condition (c)
	if (i == -1 && j == n) 
	{
		j = n - 2;
		i = 0;
	}
	else 
	{
		//checking condition (a)
		if (j == n)
			j = 0;
		if (i < 0)
			i = n - 1;
		}
		//checking condition (b)
		if (magic[i][j]) 
		{
			j -= 2;
			i++;
			continue;
		}
		else
		{
		   	//placing the number into the array
		   	magic[i][j] = k; 
			k++;
		}	
		//for the next number setting (i-1, j+1)
		j++;
		i--; 
	}
	//printing the matrix
	for (int i = 0; i < n; i++)
 {
		for (int j = 0; j < n; j++)
			cout << magic[i][j] << "  ";
		cout << endl;
	}	
}
int main()
{
	//This code works for only odd numbers
	int n = 7;
	cout<<"The magic sum is " << n*(n*n+1)/2 <<endl;
	GenerateMagicSquare(n);
	return 0;
}

Вывод примера:

The magic sum is 175

20  12  4  45  37  29  28
11  3  44  36  35  27  19
2  43  42  34  26  18  10
49  41  33  25  17  9  1
40  32  24  16  8  7  48
31  23  15  14  6  47  39
22  21  13  5  46  38  30

Python Код Магический квадрат

def GenerateMagicSquare(n):
#initializing the array
	magic = [[0 for x in range(n)]
				for y in range(n)]
	#setting row and column value
	i = n // 2
	j = n - 1
	k = 1
	while k <= (n * n):
	    #checking condition (c)
		if i == -1 and j == n: 
			j = n - 2
			i = 0
		else:
			#checking condition (a)
			if j == n:
				j = 0
			if i < 0:
				i = n - 1
        #checking conditon (b)
		if magic[i][j]: 
			j = j - 2
			i = i + 1
			continue
		else:
		    #placing the number into the array
			magic[i][j] = k
			k = k + 1
        #for the next number setting (i-1, j+1)
		j = j + 1
		i = i - 1 
	#printing the matrix
	for i in range(0, n):
		for j in range(0, n):
			print('%2d ' % (magic[i][j]),end='')
			if j == n - 1:
				print()
#This code works for only odd numbers
n = 7
print("The magic sum is ",n * (n * n + 1) // 2, "\n")
GenerateMagicSquare(n)

Вывод примера:

The magic sum is  175

20 12  4 45 37 29 28 
11  3 44 36 35 27 19 
 2 43 42 34 26 18 10 
49 41 33 25 17  9  1 
40 32 24 16  8  7 48 
31 23 15 14  6 47 39 
22 21 13  5 46 38 30

Анализ сложности

  • Космическая сложность: Чтобы поддерживать матрицу магического квадрата, нам нужен массив *n. Итак, пространственная сложность будет O(n^2).
  • Сложность времени: Код, который мы использовали для создания математических вычислений с магическими квадратами, состоит из двух циклов. Внешний цикл выполняется n раз, и внутренний цикл также выполняется n раз. В конечном итоге временная сложность равна O(n^2).