Čarobni kvadrat – riješite 3×3 zagonetku koristeći C & Python Primjeri

Što je Magični kvadrat?

Magični kvadrat je kvadratna matrica s posebnim rasporedom brojeva. Ovi su brojevi raspoređeni tako da zbroj brojeva na svakoj dijagonali, retku i stupcu ostaje isti. Igre čarobnih kvadrata jednostavne su logičke zagonetke koje se koriste u rekreativnoj matematici.

Primjer magičnih kvadrata:

Čarobni trg

Gornji dijagram je primjer magičnog kvadrata reda 3. Zbroj svake dijagonale, retka i stupca je 15.

Kako funkcionira Magic Square

Magični kvadrati su n*n matrice koje se sastoje od n^2 pozitivna cijela broja. Broj redaka ili stupaca kvadratne matrice naziva se redom matrice.

Obično zagonetke s čarobnim kvadratima imaju neparne redoslijede i cijele brojeve od 1 do n^2. Zbroj svake dijagonale, retka i stupca je isti. Taj se broj naziva magična suma ili magična konstanta. Općenito, ovaj magični zbroj ovisi o redoslijedu matrice. Formula magičnih kvadrata za magični zbroj reda n je-

Magic Square radi

Uzmimo primjer magičnog kvadrata s cijelim brojevima 3. Dakle, magični zbroj bi bio-

Magic Square radi

Magic Square radi

Zašto se zovu Magic?

Drevni matematičari bili su fascinirani prirodom nekoliko zanimljivih kombinacija brojeva. Magični kvadrat bio je jedan od njih. Najraniji dokazi o čarobnim kvadratima datiraju iz Kine 190. godine prije nove ere.

Neka istraživanja pokazuju dokaze o slagalici Magičnih kvadrata u drevnom Japanu, Indiji i Arabiji. Na temelju nekih legendi pretpostavljalo se da su te posebne formacije brojeva povezane s magičnim svijetom. Stoga su ti kvadrati nazvani magični kvadrati.

Vrste magičnog kvadrata

Postoje različite varijante matematike čarobnih kvadrata –

  • Normalni magični kvadrat: Ova vrsta magičnog kvadrata sadrži prvih n^2 brojeva.
  • Polu-magični kvadrat: U ovoj vrsti, samo retci i stupac zbrajaju magičnu konstantu.
  • Jednostavan magični kvadrat: Za razliku od prethodnog tipa, retci, stupci i obje dijagonale zbrajaju magičnu konstantu.
  • Najsavršeniji magični kvadrat: Ovo je normalan magični kvadrat s dva posebna svojstva. Ovdje svaki podkvadrat 2 puta 2 matrice daje ukupno 2(n^2+1). I bilo koji par brojeva koji su n/2 kvadrata odvojeno od rešetke zbroji se do n^2+1.

Na temelju svojstava postoji mnogo više vrsta čarobnih kvadrata. Ali kad god samo spomenemo magični kvadrat, pretpostavljamo da je to normalan i jednostavan magični kvadrat neparnog reda.

Algoritam za generiranje magičnog kvadrata

Algoritam za generiranje magičnih kvadrata neparnog reda je:

  • Prvi broj ili 1 bit će pohranjen na (n/2, n-1), gdje je prva koordinata položaj retka, a druga koordinata položaj stupca. Za kasnije korake, označimo ovu poziciju kao (x, y).
  • Sljedeći brojevi bit će pohranjeni na (x-1, y+1). Ako pozicija nije valjana, razmotrit ćemo sljedeće uvjete.
    1. Ako je položaj retka -1, iskrivit će se na n-1. Slično, ako je izračunati položaj stupca n, izvit će se na 0.
    2. Pozicija retka će se povećati za 1, a pozicija stupca će se smanjiti za 2 ako izračunata pozicija već sadrži broj.
    3. Ako je položaj retka -1, a položaj odgovarajućeg stupca n, novi položaj bit će (0, n-2.

Bilješka: Ovaj algoritam generira samo važeće magične kvadrate neparnog reda. Ovaj magični kvadrat također smatramo normalnim magičnim kvadratom s prvih n^2 brojeva. Štoviše, može postojati više rješenja za istu vrijednost n.

Uzmimo primjer i vidimo kako funkcionira. Recimo da želimo pronaći magični kvadrat reda 3. Kako će to biti jednostavan i normalan magični kvadrat neparnog reda, sadržavat će sve brojeve od 1 do 3^2 ili 9.

Kako radi?

Prema našim algoritam, koraci će biti sljedeći:

Korak 1) Prvi broj ili 1 bit će na poziciji (3/2, 3-1) ili (1, 2). Prema konvenciji, uzmite u obzir x= 1 i y= 2 za kasnije korake.

Algoritam za generiranje magičnog kvadrata

Korak 2) Pozicija za ostale brojeve izračunat će se na sljedeći način-

Pozicija broja 2:

Sljedeći broj bit će na (x-1, y+1) ili (0, 3), što nije važeća pozicija. Korištenjem uvjeta (a), odgovarajuća važeća pozicija bila bi (0,0). Dakle, x= 0, y= 0.

Algoritam za generiranje magičnog kvadrata

Pozicija broja 3:

Broj 3 bit će na (x-1, y+1) ili (-1, 1), što nije važeća pozicija. Korištenjem uvjeta (a), važeća pozicija retka bila bi n-1 ili 2. Dakle, broj 3 bit će na (2, 1). Za sljedeći broj, x= 2, y= 1.

Algoritam za generiranje magičnog kvadrata

Pozicija broja 4:

Broj 4 trebao bi biti na (x-1, y+1) ili (1, 2) što je važeća pozicija. Ali ta pozicija već sadrži broj. Prema uvjetu (b), važeća pozicija bi bila (1+1, 2-2) ili (2,0). Za sljedeći broj x= 2, y= 0.

Algoritam za generiranje magičnog kvadrata

Pozicija broja 5:

Broj 5 trebao bi biti na (x-1, y+1) ili (1, 1) što je važeća pozicija. Za sljedeći broj x= 1, y= 1.

Algoritam za generiranje magičnog kvadrata

Pozicija broja 6:

Broj 6 trebao bi biti na (x-1, y+1) ili (0, 2) što je važeća pozicija. Za sljedeći broj x= 0, y= 2.

Algoritam za generiranje magičnog kvadrata

Pozicija broja 7:

Broj 7 trebao bi biti na (x-1, y+1) ili (-1, 3) što nije važeća pozicija. Prema uvjetu (c), važeća pozicija bila bi (0, n-2) ili (0, 1). Za sljedeći broj x= 0, y= 1.

Algoritam za generiranje magičnog kvadrata

Pozicija broja 8:

Broj 8 trebao bi biti na (x-1, y+1) ili (-1, 2) što nije važeća pozicija. Korištenjem uvjeta (a), valjana pozicija bila bi (2, 2). Za sljedeći broj x= 2, y= 2.

Algoritam za generiranje magičnog kvadrata

Pozicija broja 9:

Broj 9 trebao bi biti na (x-1, y+1) ili (1, 3) što nije važeća pozicija. Korištenjem uvjeta (a), važeća pozicija bila bi (1, 0).

Algoritam za generiranje magičnog kvadrata

Pseudo-kod

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++ Magični kvadrat koda

Ulazni:

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

Izlaz primjera:

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 Magični kvadrat koda

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)

Izlaz primjera:

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

Analiza složenosti

  • Složenost prostora: Da bismo održali matricu magičnog kvadrata, potreban nam je niz*n. Dakle, kompleksnost prostora bila bi O(n^2).
  • Složenost vremena: Kod koji smo koristili za generiranje matematike čarobnih kvadrata sastoji se od dvije petlje. Vanjska petlja se izvodi n puta, a unutarnja petlja također se izvodi n puta. U konačnici, vremenska složenost je O(n^2).