Hvordan løse 3×3 magiske firkanter i C & Python

⚡ Smart oppsummering

Magiske firkant-puslespill arrangerer fortløpende tall i et n ganger n-rutenett slik at hver rad, kolonne og hoveddiagonal produserer samme totalsum, kalt den magiske konstanten, noe som gjør dem til en klassisk øvelse i rekreasjonsmatematikk og algoritmisk tenkning.

  • 🔢 Magisk konstant formel: For ethvert normalt magisk kvadrat av orden n er den magiske summen lik n(n²+1)/2, som gir 15 for orden 3 og 175 for orden 7.
  • 🧩 Siamesisk metode: Magiske firkanter av oddeorden genereres ved å plassere 1 midt på den øverste raden, og deretter flytte den opp til høyre mens man håndterer omslutnings- og kollisjonsregler.
  • 📐 Firkantede varianter: Magiske firkanter klassifiseres som normale, semi-magiske, enkle og mest perfekte, med hver variant definert av hvilke summer som må samsvare med den magiske konstanten.
  • Fungerende implementeringer: Identisk C++ og Python Programmer konstruerer et hvilket som helst oddeordens kvadrat i O(n²) tid ved å bruke O(n²) hjelperom.
  • 🧪 Steg-for-steg-demo: En detaljert 3 x 3-gjennomgang viser hvordan hver av de ni plasseringene oppfyller rad-, kolonne- og diagonalregelen.

Hva er et magisk kvadrat?

Et magisk kvadrat er en kvadratmatrise med en spesiell plassering av tall. Verdiene er plassert slik at summen i hver rad, hver kolonne og begge hoveddiagonalene forblir den samme. Magiske kvadrater er enkle logiske oppgaver som brukes i rekreasjonsmatematikk.

Eksempel på magiske firkanter:

Magic Square

Diagrammet ovenfor viser et magisk kvadrat av orden 3. Summen av hver diagonal, rad og kolonne er lik 15. Neste avsnitt forklarer hvordan denne konstante summen produseres.

Hvordan magiske firkanter fungerer

Et magisk kvadrat av orden n er en n ganger n-matrise som inneholder n² positive heltall. Antall rader eller kolonner kalles matrisens orden.

Typiske magiske firkantpuslespill har en odderekkefølge og bruker heltall fra 1 til n². Fordi hver rad, kolonne og diagonal må summere seg til samme verdi, kalles denne verdien den magiske summen eller magiske konstanten. Konstanten avhenger bare av n. Formelen for den magiske summen av orden n er:

Magic Square fungerer

Tenk deg et magisk kvadrat av orden 3. Den magiske summen er da:

Magic Square fungerer

Magic Square fungerer

Denne formelen forklarer regnestykket, men puslespillet har en lang kulturhistorie som gir det sitt minneverdige navn.

Hvorfor kalles de magi?

Gamle matematikere var fascinert av interessante tallkombinasjoner, og det magiske kvadratet var en av dem. De tidligste bevisene stammer fra Kina rundt 190 f.Kr.

Studier viser bevis på magiske firkantgåter i det gamle Japan, India og Arabia. Legender knyttet disse arrangementene til den magiske verden, og navnet ble værende. Utover folklore har matematikere også definert formelle kategorier som skiller en firkant fra en annen.

Typer Magic Square

Det finnes flere varianter av magiske firkanter i matematikk:

  • Normal Magic Square: Inneholder de første n² naturlige tallene.
  • Semi-Magic Square: Bare radene og kolonnene summerer seg til den magiske konstanten.
  • Simple Magic Square: Radene, kolonnene og begge hoveddiagonalene summerer seg til den magiske konstanten.
  • Most Perfect Magic Square: Et normalt magisk kvadrat med to ekstra egenskaper. Hvert 2 x 2 underkvadrat i matrisen summerer seg til 2(n²+1), og ethvert tallpar som er n/2 celler fra hverandre summerer seg til n²+1.

Flere kategorier finnes basert på tilleggsegenskaper. Når begrepet «magisk kvadrat» brukes uten forbehold i denne veiledningen, refererer det til et normalt, enkelt magisk kvadrat av odde orden.

Algoritme for å generere et magisk kvadrat

Den klassiske algoritmen for å generere et magisk kvadrat av odde orden, kalt den siamesiske metoden, er som følger:

  • Det første tallet (1) lagres i posisjon (n/2, n-1), hvor den første koordinaten er radindeksen og den andre er kolonneindeksen. For senere trinn, kall denne posisjonen (x, y).
  • Det neste tallet plasseres ved (x-1, y+1). Hvis den posisjonen er ugyldig, bruk følgende regler:
    1. Hvis radindeksen er -1, brytes den til n-1. Hvis kolonneindeksen er n, brytes den til 0.
    2. Hvis den beregnede posisjonen allerede inneholder et tall, øk raden med 1 og reduser kolonnen med 2.
    3. Hvis raden er -1 og kolonnen er n samtidig, er den nye posisjonen (0, n-2).

OBS: Denne algoritmen genererer bare gyldige magiske kvadrater av oddeorden. Resultatet er et normalt magisk kvadrat som inneholder de første n² naturlige tallene. Det kan være mer enn én gyldig løsning for samme n.

Reglene blir tydeligere gjennom et lite eksempel med rekkefølge 3, som bruker tallene 1 til 9.

Slik fungerer det på en 3 x 3-kvadrat

Bruk av algoritme ovenfor er trinnene:

Trinn 1) Det første tallet (1) plasseres ved (3/2, 3-1) eller (1, 2). For senere trinn, sett x = 1 og y = 2.

Algoritme for å generere magisk kvadrat

Trinn 2) Plasseringen av de resterende tallene beregnes som følger.

Plassering nummer 2:

Det neste tallet skal gå til (x-1, y+1) eller (0, 3), som ikke er en gyldig posisjon. I henhold til regel (a) brytes kolonnen til 0, noe som gir (0, 0). Sett x = 0, y = 0.

Algoritme for å generere magisk kvadrat

Plassering nummer 3:

Tallet 3 skal være på (x-1, y+1) eller (-1, 1), som ikke er en gyldig posisjon. I henhold til regel (a) brytes raden til n-1 (som er 2). Så tallet 3 går til (2, 1). Sett x = 2, y = 1.

Algoritme for å generere magisk kvadrat

Plassering nummer 4:

Tallet 4 skal være ved (x-1, y+1) eller (1, 2), som er gyldig, men allerede inneholder 1. I henhold til regel (b) er den nye posisjonen (1+1, 2-2) eller (2, 0). Sett x = 2, y = 0.

Algoritme for å generere magisk kvadrat

Plassering nummer 5:

Tallet 5 skal være på (x-1, y+1) eller (1, 1), som er en gyldig tom posisjon. Sett x = 1, y = 1.

Algoritme for å generere magisk kvadrat

Plassering nummer 6:

Tallet 6 skal være på (x-1, y+1) eller (0, 2), som er en gyldig tom posisjon. Sett x = 0, y = 2.

Algoritme for å generere magisk kvadrat

Plassering nummer 7:

Tallet 7 skal være ved (x-1, y+1) eller (-1, 3), noe som ikke er gyldig. I henhold til regel (c) er den nye posisjonen (0, n-2) eller (0, 1). Sett x = 0, y = 1.

Algoritme for å generere magisk kvadrat

Plassering nummer 8:

Tallet 8 skal være ved (x-1, y+1) eller (-1, 2), noe som ikke er gyldig. I henhold til regel (a) brytes raden til 2, noe som gir (2, 2). Sett x = 2, y = 2.

Algoritme for å generere magisk kvadrat

Plassering nummer 9:

Tallet 9 skal være ved (x-1, y+1) eller (1, 3), noe som ikke er gyldig. I henhold til regel (a) brytes kolonnen til 0, noe som gir (1, 0).

Algoritme for å generere magisk kvadrat

Når hver celle er fylt, oversettes den samme logikken direkte til pseudokode.

Pseudokode for Magic Square

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

Pseudokoden kartlegges direkte på kompilerte og tolkede språk, vist nedenfor C++ og Python.

C++ Code for Magisk firkant

Inngang:

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

Utgang av 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

Ocuco Python Versjonen nedenfor bruker identiske rad- og kolonneregler.

Python Code for Magisk firkant

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)

Utgang av 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

Begge implementeringene oppfører seg identisk, noe som gjør det enkelt å sammenligne kostnadene.

Kompleksitetsanalyse

  • Romkompleksitet: Det magiske kvadratet lagres i en n ganger n-matrise, så romkompleksiteten er O(n²).
  • Tidskompleksitet: Generatoren bruker to nestede løkker. Den ytre løkken går n ganger, og den indre løkken går også n ganger, så den totale tidskompleksiteten er O(n²).

Spørsmål og svar

For et normalt magisk kvadrat på 3 ganger 3 som inneholder tallene 1 til 9, er den magiske konstanten 15. Hver rad, kolonne og hoveddiagonal må summere seg til 15, noe som følger av formelen n(n²+1)/2 med n lik 3.

Nei. Den siamesiske metoden som vises i denne veiledningen er kun definert for magiske kvadrater av oddeorden. Partallsordener krever forskjellige algoritmer, for eksempel dobbelt partalls- (n delelig med 4) og enkelt partalls- (n lik 4k+2) konstruksjoner, som bruker forskjellige regler.

Generatoren fyller en n ganger n-matrise, så både tids- og romkompleksiteten er O(n²). Hver celle besøkes et konstant antall ganger, og lagringsplassen er nøyaktig n² heltall. Dette gjør algoritmen effektiv for typiske rekreasjonsstørrelser.

AI-teknikker som genetiske algoritmer, simulert gløding og begrensningsløsere kan søke etter gyldige magiske kvadrater når lukkede metoder ikke gjelder, inkludert partallsordener, delvise kvadrater og varianter med ekstra begrensninger som kun primtall eller geometriske magiske kvadrater.

Magiske kvadrater er referanseproblemer for kombinatorisk optimalisering, forsterkningslæringsagenter og nevralt søk. Forskere bruker dem til å teste heuristikker, metaheuristikker og AI-planleggere på strukturerte diskrete rom, siden løsninger er enkle å verifisere, men å telle dem forblir et åpent matematisk problem.

Oppsummer dette innlegget med: