Sådan løser du 3×3 magiske firkanter i C & Python

⚡ Smart opsummering

Magiske firkant-gåder arrangerer fortløbende tal i et n gange n-felt, så hver række, kolonne og hoveddiagonal producerer den samme total, kaldet den magiske konstant, hvilket gør dem til en klassisk øvelse i rekreativ matematik og algoritmisk tænkning.

  • 🔢 Magisk konstant formel: For ethvert normalt magisk kvadrat af orden n er den magiske sum lig med n(n²+1)/2, hvilket giver 15 for orden 3 og 175 for orden 7.
  • 🧩 Siamesisk metode: Magiske firkanter af ulige orden genereres ved at placere 1 midt i den øverste række og derefter flytte det opad til højre, mens man håndterer wrap-around- og kollisionsregler.
  • 📐 Firkantede varianter: Magiske firkanter klassificeres som normale, semi-magiske, simple og mest perfekte, hvor hver variant er defineret af hvilke summer, der skal matche den magiske konstant.
  • Fungerende implementeringer: Identisk C++ og Python Programmer konstruerer ethvert kvadrat af ulige orden i O(n²) tid ved hjælp af O(n²) hjælperum.
  • 🧪 Trin-for-trin demo: En detaljeret 3 x 3-gennemgang viser, hvordan hver af de ni placeringer opfylder række-, kolonne- og diagonalreglen.

Hvad er en magisk firkant?

Et magisk kvadrat er en kvadratmatrix med en særlig opstilling af tal. Værdierne er placeret således, at summen i hver række, hver kolonne og begge hoveddiagonaler forbliver den samme. Magiske kvadrater er simple logiske gåder, der bruges i rekreativ matematik.

Eksempel på magiske firkanter:

Magic Square

Diagrammet ovenfor viser et magisk kvadrat af orden 3. Summen af ​​hver diagonal, række og kolonne er lig med 15. I næste afsnit forklares, hvordan denne konstante total frembringes.

Hvordan magiske firkanter fungerer

Et magisk kvadrat af orden n er en n gange n matrix, der indeholder n² positive heltal. Antallet af rækker eller kolonner kaldes matrixens orden.

Typiske magiske kvadratgåder har en ulige rækkefølge og bruger heltal fra 1 til n². Fordi hver række, kolonne og diagonal skal summere til den samme værdi, kaldes denne værdi den magiske sum eller magiske konstant. Konstanten afhænger kun af n. Formlen for den magiske sum af orden n er:

Magic Square virker

Betragt et magisk kvadrat af orden 3. Den magiske sum er da:

Magic Square virker

Magic Square virker

Denne formel forklarer regnestykket, men puslespillet har en lang kulturhistorie, der giver det sit mindeværdige navn.

Hvorfor kaldes de magi?

Gamle matematikere var fascinerede af interessante talkombinationer, og det magiske kvadrat var en af ​​dem. De tidligste beviser stammer fra Kina omkring 190 f.Kr.

Studier viser tegn på magiske firkantgåder i det gamle Japan, Indien og Arabien. Legender forbandt disse arrangementer med den magiske verden, og navnet stod fast. Ud over folklore har matematikere også defineret formelle kategorier, der adskiller et firkant fra et andet.

Typer af Magic Square

Der findes flere varianter af magiske firkanter i matematik:

  • Normal Magic Square: Indeholder de første n² naturlige tal.
  • Semi-Magic Square: Kun rækkerne og kolonnerne summerer sig til den magiske konstant.
  • Simple Magic Square: Rækkerne, kolonnerne og begge hoveddiagonaler lægges sammen til den magiske konstant.
  • Mest perfekte magiske kvadrat: Et normalt magisk kvadrat med to ekstra egenskaber. Hvert 2 gange 2 underkvadrat i matricen summerer sig til 2(n²+1), og ethvert par af tal, der er n/2 celler fra hinanden, summerer sig til n²+1.

Der findes flere kategorier baseret på yderligere egenskaber. Når udtrykket "magisk kvadrat" bruges uden forbehold i denne vejledning, refererer det til et ulige, normalt, simpelt magisk kvadrat.

Algoritme til at generere et magisk kvadrat

Den klassiske algoritme til at generere et magisk kvadrat af ulige orden, kaldet den siamesiske metode, er som følger:

  • Det første tal (1) gemmes på position (n/2, n-1), hvor den første koordinat er rækkeindekset og den anden er kolonneindekset. For senere trin, kald denne position (x, y).
  • Det næste tal placeres ved (x-1, y+1). Hvis denne position er ugyldig, skal følgende regler anvendes:
    1. Hvis rækkeindekset er -1, ombrydes det til n-1. Hvis kolonneindekset er n, ombrydes det til 0.
    2. Hvis den beregnede position allerede indeholder et tal, skal du øge rækken med 1 og formindske kolonnen med 2.
    3. Hvis rækken er -1 og kolonnen samtidig er n, er den nye position (0, n-2).

Bemærk: Denne algoritme genererer kun gyldige magiske kvadrater af ulige orden. Resultatet er et normalt magisk kvadrat, der indeholder de første n² naturlige tal. Der kan være mere end én gyldig løsning for det samme n.

Reglerne bliver tydeligere gennem et lille eksempel med rækkefølge 3, som bruger tallene 1 til 9.

Sådan fungerer det på en 3 x 3 firkant

Anvendelse af algoritme ovenfor er trinnene:

Trin 1) Det første tal (1) placeres ved (3/2, 3-1) eller (1, 2). For senere trin, sæt x = 1 og y = 2.

Algoritme til at generere Magic Square

Trin 2) Positionerne for de resterende tal beregnes som følger.

Position nummer 2:

Det næste tal skal gå til (x-1, y+1) eller (0, 3), hvilket ikke er en gyldig position. Ved at følge regel (a) ombrydes kolonnen til 0, hvilket giver (0, 0). Sæt x = 0, y = 0.

Algoritme til at generere Magic Square

Position nummer 3:

Tallet 3 skal være ved (x-1, y+1) eller (-1, 1), hvilket ikke er en gyldig position. Ved at følge regel (a) ombrydes rækken til n-1 (som er 2). Så tallet 3 går til (2, 1). Sæt x = 2, y = 1.

Algoritme til at generere Magic Square

Position nummer 4:

Tallet 4 skal være ved (x-1, y+1) eller (1, 2), hvilket er gyldigt, men allerede indeholder 1. Ifølge regel (b) er den nye position (1+1, 2-2) eller (2, 0). Sæt x = 2, y = 0.

Algoritme til at generere Magic Square

Position nummer 5:

Tallet 5 skal være ved (x-1, y+1) eller (1, 1), hvilket er en gyldig tom position. Sæt x = 1, y = 1.

Algoritme til at generere Magic Square

Position nummer 6:

Tallet 6 skal være ved (x-1, y+1) eller (0, 2), hvilket er en gyldig tom position. Sæt x = 0, y = 2.

Algoritme til at generere Magic Square

Position nummer 7:

Tallet 7 skal være ved (x-1, y+1) eller (-1, 3), hvilket ikke er gyldigt. Ifølge regel (c) er den nye position (0, n-2) eller (0, 1). Sæt x = 0, y = 1.

Algoritme til at generere Magic Square

Position nummer 8:

Tallet 8 skal være ved (x-1, y+1) eller (-1, 2), hvilket ikke er gyldigt. Ved at følge regel (a) ombrydes rækken til 2, hvilket giver (2, 2). Sæt x = 2, y = 2.

Algoritme til at generere Magic Square

Position nummer 9:

Tallet 9 skal være ved (x-1, y+1) eller (1, 3), hvilket ikke er gyldigt. Ved regel (a) ombrydes kolonnen til 0, hvilket giver (1, 0).

Algoritme til at generere Magic Square

Når hver celle er udfyldt, oversættes den samme logik direkte til pseudokode.

Pseudokode til 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 knyttes direkte til kompilerede og fortolkede sprog, vist nedenfor C++ og Python.

C++ Code til Magisk Firkant

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 Versionen nedenfor bruger identiske række- og kolonneregler.

Python Code til 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)

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

Begge implementeringer opfører sig identisk, hvilket gør det nemt at sammenligne deres omkostninger.

Kompleksitetsanalyse

  • Rumkompleksitet: Det magiske kvadrat er gemt i et n gange n array, så rumkompleksiteten er O(n²).
  • Tidskompleksitet: Generatoren bruger to indbyggede løkker. Den ydre løkke kører n gange, og den indre løkke kører også n gange, så den samlede tidskompleksitet er O(n²).

Ofte Stillede Spørgsmål

For et normalt 3 gange 3 magisk kvadrat, der indeholder tallene 1 til 9, er den magiske konstant 15. Hver række, kolonne og hoveddiagonal skal summere sig til 15, hvilket følger af formlen n(n²+1)/2 med n lig med 3.

Nej. Den siamesiske metode, der er vist i denne vejledning, er kun defineret for magiske kvadrater af ulige orden. Lige ordener kræver forskellige algoritmer, såsom dobbelt lige (n deleligt med 4) og enkelt lige (n lig med 4k+2) konstruktioner, som bruger forskellige regler.

Generatoren udfylder en n gange n matrix, så både tids- og rumkompleksitet er O(n²). Hver celle besøges et konstant antal gange, og lageret er præcis n² heltal. Dette gør algoritmen effektiv til typiske rekreative størrelser.

AI-teknikker såsom genetiske algoritmer, simuleret udglødning og begrænsningsopfyldelsesløsere kan søge efter gyldige magiske kvadrater, når lukkede metoder ikke gælder, herunder lige ordener, delvise kvadrater og varianter med ekstra begrænsninger som kun primtal eller geometriske magiske kvadrater.

Magiske kvadrater er benchmarkproblemer for kombinatorisk optimering, forstærkningslæringsagenter og neural søgning. Forskere bruger dem til at teste heuristikker, metaheuristikker og AI-planlæggere på strukturerede diskrete rum, da løsninger er lette at verificere, men at tælle dem forbliver et åbent matematisk problem.

Opsummer dette indlæg med: