Magický čtverec – Vyřešte hádanku 3×3 pomocí C & Python Příklady

Co je Magic Square?

Magický čtverec je čtvercová matice se speciálním uspořádáním čísel. Tato čísla jsou uspořádána tak, aby součet čísel na každé diagonále, řádku a sloupci zůstal stejný. Hry s magickými čtverci jsou jednoduché logické hádanky používané v rekreační matematice.

Příklad magických čtverců:

magic Square

Výše uvedený diagram je příklad magického čtverce řádu 3. Součet každé úhlopříčky, řádku a sloupce je 15.

Jak Magic Square funguje

Magické čtverce jsou n*n matic sestávajících z n^2 kladných celých čísel. Počet řádků nebo sloupců čtvercové matice se nazývá řád matice.

Hádanky magických čtverců mají obvykle liché pořadí a nesou celá čísla od 1 do n^2. Součet každé úhlopříčky, řádku a sloupce je stejný. Toto číslo se nazývá magický součet nebo magická konstanta. Obecně platí, že tato magická suma závisí na pořadí matice. Vzorec magických čtverců pro magický součet řádu n je-

Magic Square funguje

Vezměme si příklad magického čtverce s celými čísly 3. Magický součet by tedy byl-

Magic Square funguje

Magic Square funguje

Proč se jim říká magie?

Starověcí matematici byli fascinováni povahou několika zajímavých kombinací čísel. Magický čtverec byl jedním z nich. Nejstarší důkazy o magických čtvercích pocházejí z Číny v roce 190 před naším letopočtem.

Některé studie ukazují důkazy o magických čtvercích ve starověkém Japonsku, Indii a Arábii. Na základě některých legend se předpokládalo, že tyto zvláštní útvary čísel byly spojeny s magickým světem. Proto byly tyto čtverce pojmenovány magické čtverce.

Typy magického čtverce

Existují různé varianty matematiky magických čtverců –

  • Normální magický čtverec: Tento typ magického čtverce obsahuje prvních n^2 čísel.
  • Semi-Magic Square: V tomto typu se do magické konstanty sčítají pouze řádky a sloupec.
  • Jednoduchý kouzelný čtverec: Na rozdíl od předchozího typu se řádky, sloupce a obě úhlopříčky sčítají do magické konstanty.
  • Nejdokonalejší magický čtverec: Toto je normální magický čtverec se dvěma speciálními vlastnostmi. Zde každý 2 x 2 dílčí čtverec matice dává dohromady 2 (n^2+1). A libovolná dvojice čísel, která jsou n/2 čtverců od součtu mřížky na n^2+1.

Na základě vlastností existuje mnohem více druhů magických čtverců. Ale kdykoli se zmíníme o magickém čtverci, předpokládáme, že jde o normální a jednoduchý magický čtverec lichého řádu.

Algoritmus pro generování magického čtverce

Algoritmus pro generování magických čtverců lichého řádu je:

  • První číslo nebo 1 bude uloženo jako (n/2, n-1), kde první souřadnice je pozice řádku a druhá souřadnice je pozice sloupce. Pro pozdější kroky označme tuto pozici jako (x, y).
  • Další čísla budou uložena jako (x-1, y+1). Pokud pozice není platná, zvážíme následující podmínky.
    1. Pokud je pozice řádku -1, bude se deformovat na n-1. Podobně, pokud je vypočítaná pozice sloupce n, bude se deformovat na 0.
    2. Pozice řádku se zvýší o 1 a pozice sloupce se sníží o 2, pokud vypočtená pozice již obsahuje číslo.
    3. Pokud je pozice řádku -1 a odpovídající pozice sloupce je n, bude nová pozice (0, n-2.

Poznámka: Tento algoritmus generuje pouze platné magické čtverce lichého řádu. Tento magický čtverec také považujeme za normální magický čtverec s prvními n^2 čísly. Navíc pro stejnou hodnotu n může být více řešení.

Vezměme si příklad a uvidíme, jak to funguje. Řekněme, že chceme najít magický čtverec řádu 3. Protože to bude jednoduchý a normální magický čtverec lichého řádu, bude obsahovat všechna čísla od 1 do 3^2 nebo 9.

Jak to funguje?

Podle našich algoritmus, kroky budou následující:

Krok 1) První číslo nebo 1 bude na pozici (3/2, 3-1) nebo (1, 2). Podle konvence zvažte x= 1 a y= 2 pro pozdější kroky.

Algoritmus pro generování magického čtverce

Krok 2) Pozice pro zbytek čísel bude vypočítána následujícím způsobem-

Pozice čísla 2:

Další číslo bude na (x-1, y+1) nebo (0, 3), což není platná pozice. Při použití podmínky (a) by odpovídající platná pozice byla (0,0). Takže x = 0, y = 0.

Algoritmus pro generování magického čtverce

Pozice čísla 3:

Číslo 3 bude na (x-1, y+1) nebo (-1, 1), což není platná pozice. Při použití podmínky (a) by platná pozice řádku byla n-1 nebo 2. Takže číslo 3 bude na (2, 1). Pro další číslo, x= 2, y= 1.

Algoritmus pro generování magického čtverce

Pozice čísla 4:

Číslo 4 by mělo být na (x-1, y+1) nebo (1, 2), což je platná pozice. Ale tato pozice již obsahuje číslo. Podle podmínky (b) by platná pozice byla (1+1, 2-2) nebo (2,0). Pro další číslo x= 2 je y= 0.

Algoritmus pro generování magického čtverce

Pozice čísla 5:

Číslo 5 by mělo být na (x-1, y+1) nebo (1, 1), což je platná pozice. Pro další číslo x= 1 je y= 1.

Algoritmus pro generování magického čtverce

Pozice čísla 6:

Číslo 6 by mělo být na (x-1, y+1) nebo (0, 2), což je platná pozice. Pro další číslo x= 0 je y= 2.

Algoritmus pro generování magického čtverce

Pozice čísla 7:

Číslo 7 by mělo být na (x-1, y+1) nebo (-1, 3), což není platná pozice. Podle podmínky (c) by platná pozice byla (0, n-2) nebo (0, 1). Pro další číslo x= 0, y= 1.

Algoritmus pro generování magického čtverce

Pozice čísla 8:

Číslo 8 by mělo být na (x-1, y+1) nebo (-1, 2), což není platná pozice. Při použití podmínky (a) by platná pozice byla (2, 2). Pro další číslo x= 2 je y= 2.

Algoritmus pro generování magického čtverce

Pozice čísla 9:

Číslo 9 by mělo být na (x-1, y+1) nebo (1, 3), což není platná pozice. Při použití podmínky (a) by platná pozice byla (1, 0).

Algoritmus pro generování magického čtverce

Pseudo kód

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++ Kouzelný čtverec kódu

Vstup:

/*
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;
}

Výstup příkladu:

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 Kouzelný čtverec kódu

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)

Výstup příkladu:

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

Analýza složitosti

  • Prostorová složitost: Abychom zachovali magickou čtvercovou matici, potřebujeme pole *n. Prostorová složitost by tedy byla O(n^2).
  • Časová složitost: Kód, který jsme použili ke generování magických čtverců, se skládá ze dvou smyček. Vnější smyčka běží nkrát a vnitřní smyčka také běží nkrát. Časová složitost je nakonec O(n^2).