Магически квадрат – Решете пъзел 3×3 с помощта на C & Python Примери

Какво е Magic Square?

Магическият квадрат е квадратна матрица със специално подреждане на числата. Тези числа са подредени така, че сумата от числата на всеки диагонал, ред и колона остава същата. Игрите с магически квадрати са прости логически пъзели, използвани в развлекателната математика.

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

Магически площад

Посочената по-горе диаграма е пример за магически квадрат от порядък 3. Сборът на всеки диагонал, ред и колона е 15.

Как работи Magic Square

Магическите квадрати са n*n матрици, състоящи се от n^2 положителни цели числа. Броят на редовете или колоните на квадратна матрица се нарича ред на матрицата.

Обикновено пъзелите с магически квадрати имат нечетен ред и носят цели числа от 1 до n^2. Сумата на всеки диагонал, ред и колона е една и съща. Това число се нарича магическа сума или магическа константа. Като цяло тази магическа сума зависи от реда на матрицата. Формулата на магическите квадрати за магическата сума от ред n е-

Magic Square работи

Нека вземем пример за магически квадрат с цели числа 3. И така, магическата сума ще бъде-

Magic Square работи

Magic Square работи

Защо се наричат ​​Магия?

Древните математици са били очаровани от природата на няколко интересни комбинации от числа. Магическият квадрат беше един от тях. Най-ранните доказателства за магически квадрати датират от Китай през 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 или 9.

Как работи?

Според нашия алгоритъм, стъпките ще бъдат следните:

Стъпка 1) Първото число или 1 ще бъде на позиция (3/2, 3-1) или (1, 2). По конвенция вземете x= 1 и y= 2 за по-късни стъпки.

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

Стъпка 2) Позицията за останалите числа ще бъде изчислена по следния начин-

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

Следващото число ще бъде на (x-1, y+1) или (0, 3), което не е валидна позиция. Чрез използване на условие (a), съответната валидна позиция ще бъде (0,0). И така, x= 0, y= 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).