Č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:
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-
Uzmimo primjer magičnog kvadrata s cijelim brojevima 3. Dakle, magični zbroj bi bio-
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.
- 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.
- Pozicija retka će se povećati za 1, a pozicija stupca će se smanjiti za 2 ako izračunata pozicija već sadrži broj.
- 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.
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.
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.
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.
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.
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.
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.
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.
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).
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).