Magic Square – Løs 3×3 puslespil ved hjælp af C & Python Eksempler
Hvad er Magic Square?
En magisk firkant er en firkantet matrix med et særligt talarrangement. Disse tal er arrangeret, så summen af tallene på hver diagonal, række og kolonne forbliver den samme. Magiske kvadrater-spil er simple logiske gåder, der bruges i rekreativ matematik.
Eksempel på magiske firkanter:
Ovenstående diagram er et eksempel på et magisk kvadrat af orden 3. Summen af hver diagonal, række og kolonne er 15.
Sådan fungerer Magic Square
Magiske kvadrater er n*n matricer bestående af n^2 positive heltal. Antallet af rækker eller kolonner i en kvadratisk matrix kaldes rækkefølgen af matrixen.
Typisk har magiske kvadrater puslespil ulige rækkefølger og bærer heltal fra 1 til n^2. Summen af hver diagonal, række og kolonne er den samme. Dette tal kaldes magisk sum eller magisk konstant. Generelt afhænger denne magiske sum af rækkefølgen af matrixen. Den magiske kvadraters formel for den magiske sum af orden n er-
Lad os tage et eksempel på et magisk kvadrat med heltal 3. Så den magiske sum ville være-
Hvorfor hedder de magi?
Gamle matematikere var fascineret af arten af flere interessante kombinationer af tal. Den magiske plads var en af dem. Det tidligste vidnesbyrd om magiske firkanter går tilbage til Kina i 190 fvt.
Nogle undersøgelser viser bevis for Magic squares-puslespillet i det gamle Japan, Indien og Arabien. Baseret på nogle legender blev det antaget, at disse specielle formationer af tal var forbundet med den magiske verden. Derfor blev disse firkanter kaldt magiske firkanter.
Typer af Magic Square
Der er forskellige varianter af magiske kvadraters matematik –
- Normal Magic Square: Denne type magisk firkant indeholder de første n^2 tal.
- Semi-Magic Square: I denne type summerer kun rækkerne og kolonnen til den magiske konstant.
- Simple Magic Square: I modsætning til den forrige type summerer rækkerne, kolonnerne og begge diagonaler den magiske konstant.
- Mest perfekte magiske kvadrat: Dette er en normal magisk firkant med to specielle egenskaber. Her summerer hvert 2 gange 2 underkvadrat af matricen op til i alt 2(n^2+1). Og ethvert par tal, der er n/2 kvadrater bortset fra gitterets sum til n^2+1.
Baseret på egenskaber er der mange flere typer magiske firkanter. Men når vi bare nævner den magiske firkant, antager vi, at den er en normal og simpel magisk firkant i ulige orden.
Algoritme til at generere Magic Square
Algoritmen til at generere magiske firkanter i ulige orden er:
- Det første tal eller 1 vil blive gemt ved (n/2, n-1), hvor den første koordinat er rækkepositionen, og den anden koordinat er kolonnepositionen. For senere trin, lad os betegne denne position som (x, y).
- De næste tal gemmes ved (x-1, y+1). Hvis stillingen ikke er gyldig, vil vi overveje følgende betingelser.
- Hvis rækkepositionen er -1, vil den skæve til n-1. På samme måde, hvis den beregnede kolonneposition er n, vil den fordrejes til 0.
- Rækkepositionen øges med 1, og kolonnepositionen formindskes med 2, hvis den beregnede position allerede indeholder et tal.
- Hvis rækkepositionen er -1 og den tilsvarende kolonneposition er n, vil den nye position være (0, n-2.
Bemærk: Denne algoritme genererer kun gyldige magiske kvadrater af ulige rækkefølge. Vi betragter også denne magiske firkant som en normal magisk firkant med de første n^2 tal. Desuden kan der være flere løsninger for den samme værdi af n.
Lad os tage et eksempel og se, hvordan det virker. Lad os sige, at vi vil finde det magiske kvadrat af orden 3. Da det vil være et simpelt og normalt magisk kvadrat af ulige orden, vil det indeholde alle tallene fra 1 til 3^2 eller 9.
Hvordan det virker?
Ifølge vores algoritme, vil trinene være følgende:
Trin 1) Det første tal eller 1 vil være på (3/2, 3-1) eller (1, 2) positionen. Overvej efter konvention x= 1 og y= 2 for senere trin.
Trin 2) Positionen for resten af tallene vil blive beregnet på følgende måde-
Position nummer 2:
Det næste tal vil være ved (x-1, y+1) eller (0, 3), hvilket ikke er en gyldig position. Ved at bruge betingelse (a), ville den tilsvarende gyldige position være (0,0). Så x=0, y=0.
Position nummer 3:
Nummer 3 vil være på (x-1, y+1) eller (-1, 1), hvilket ikke er en gyldig position. Ved at bruge betingelse (a), vil den gyldige rækkeposition være n-1 eller 2. Så nummer 3 vil være ved (2, 1). For det næste tal, x= 2, y= 1.
Position nummer 4:
Nummer 4 skal være ved (x-1, y+1) eller (1, 2), hvilket er en gyldig position. Men den stilling indeholder allerede et tal. Ifølge betingelse (b) vil den gyldige position være (1+1, 2-2) eller (2,0). For det næste tal er x= 2, y= 0.
Position nummer 5:
Nummer 5 skal være ved (x-1, y+1) eller (1, 1), hvilket er en gyldig position. For det næste tal x= 1, y= 1.
Position nummer 6:
Nummer 6 skal være ved (x-1, y+1) eller (0, 2), hvilket er en gyldig position. For det næste tal x= 0, y= 2.
Position nummer 7:
Nummer 7 skal være ved (x-1, y+1) eller (-1, 3), hvilket ikke er en gyldig position. Ifølge betingelse (c) vil den gyldige position være (0, n-2) eller (0, 1). For det næste tal er x= 0, y= 1.
Position nummer 8:
Nummer 8 skal være ved (x-1, y+1) eller (-1, 2), hvilket ikke er en gyldig position. Ved at bruge betingelse (a), ville den gyldige position være (2, 2). For det næste tal x= 2, y= 2.
Position nummer 9:
Nummer 9 skal være ved (x-1, y+1) eller (1, 3), hvilket ikke er en gyldig position. Ved at bruge betingelse (a), ville den gyldige position være (1, 0).
Pseudo-kode
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++ Code Magic Square
Input:
/* 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; }
Output af eksempel:
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 Code Magic Square
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)
Output af eksempel:
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
Kompleksitetsanalyse
- Rumkompleksitet: For at vedligeholde den magiske kvadratiske matrix kræver vi en*n matrix. Så rumkompleksiteten ville være O(n^2).
- Tidskompleksitet: Koden, som vi brugte til at generere magiske kvadrater matematik består af to sløjfer. Den ydre løkke løber n gange, og den indre løkke løber også n gange. I sidste ende er tidskompleksiteten O(n^2).