Kuidas lahendada 3×3 maagilise ruudu mõistatust C- ja C-tähes Python

⚡ Nutikas kokkuvõte

Maagilise ruudu mõistatused paigutavad järjestikused numbrid nxn ruudustikku nii, et iga rida, veerg ja peamine diagonaal annavad sama summa, mida nimetatakse maagiliseks konstandiks, mis teeb neist klassikalise harjutuse harrastusmatemaatikas ja algoritmilises mõtlemises.

  • 🔢 Maagilise konstandi valem: Mis tahes n-astmelise tavalise maagilise ruudu puhul on maagiline summa võrdne n(n²+1)/2-ga, mis annab 3. astme korral tulemuseks 15 ja 7. astme korral 175.
  • 🧩 Siiami meetod: Paaritu järgu maagilised ruudud genereeritakse, asetades 1 ülemise rea keskele ja seejärel liigutades seda üles paremale, käsitledes samal ajal ümberpööramise ja kokkupõrke reegleid.
  • 📐 Ruudukujulised variandid: Maagilised ruudud liigitatakse tavalisteks, poolmaagilisteks, lihtsateks ja kõige täiuslikumateks, kusjuures iga variant on määratletud selle järgi, millised summad peavad vastama maagilisele konstandile.
  • Töötavad rakendused: Identne C++ ja Python Programmid konstrueerivad suvalise paaritu järgu ruudu O(n²) ajaga, kasutades O(n²) abiruumi.
  • 🧪 Samm-sammult demo: Põhjalik 3 x 3 läbimäng näitab, kuidas iga üheksa paigutust vastab rea, veeru ja diagonaali reeglile.

Mis on maagiline ruut?

Maagiline ruut on ruutmaatriks, millel on eriline numbrite paigutus. Väärtused on paigutatud nii, et summa igas reas, igas veerus ja mõlemas peadiagonaalis jääb samaks. Maagilised ruudud on lihtsad loogikamõistatused, mida kasutatakse meelelahutusmatemaatikas.

Maagiliste ruutude näide:

Maagiline väljak

Ülaltoodud diagramm näitab kolmanda järgu maagilist ruutu. Iga diagonaali, rea ja veeru summa on võrdne 15-ga. Järgmises osas selgitatakse, kuidas see konstantne summa saadakse.

Kuidas maagilised ruudud töötavad

Maagiline ruut järguga n on n korda n maatriks, mis sisaldab n² positiivset täisarvu. Ridade või veergude arvu nimetatakse maatriksi järguks.

Tüüpilised maagilised ruudumõistatused on paaritu järguga ja kasutavad täisarve 1-st n²-ni. Kuna iga rea, veeru ja diagonaali summa peab olema sama, nimetatakse seda väärtust maagiliseks summaks või maagiliseks konstandiks. Konstant sõltub ainult n-st. Maagilise summa valem n-järgulises järjekorras on:

Magic Square töötab

Vaatleme kolmanda järgu maagilist ruutu. Maagiline summa on siis:

Magic Square töötab

Magic Square töötab

See valem selgitab aritmeetikat, kuid pusle pika kultuurilise ajaloo tõttu on see ka meeldejääv.

Miks neid maagiaks nimetatakse?

Muistsed matemaatikud olid lummatud huvitavatest numbrikombinatsioonidest ja maagiline ruut oli üks neist. Varaseimad tõendid pärinevad Hiinast umbes aastast 190 eKr.

Uuringud näitavad tõendeid võluruutude mõistatuste kohta iidses Jaapanis, Indias ja Araabias. Legendid seostasid neid paigutusi võlumaailmaga ja see nimi jäigi püsima. Lisaks folkloorile on matemaatikud määratlenud ka formaalseid kategooriaid, mis eristavad ühte ruutu teisest.

Maagilise ruudu tüübid

Matemaatikas on mitu maagiliste ruutude varianti:

  • Tavaline maagiline ruut: Sisaldab esimesi n² naturaalarvu.
  • Poolmaagiline ruut: Maagilise konstandi summeerimiseks kuluvad ainult read ja veerud.
  • Lihtne maagiline ruut: Read, veerud ja mõlemad peamised diagonaalid moodustavad maagilise konstandi.
  • Kõige täiuslikum maagiline ruut: Tavaline maagiline ruut kahe lisaomadusega. Iga 2 x 2 maatriksi osaruut annab kokku 2(n²+1) ja iga arvupaar, mis asub üksteisest n/2 lahtri kaugusel, annab kokku n²+1.

Lisakategooriaid on rohkem, mis põhinevad täiendavatel omadustel. Kui selles õpetuses kasutatakse terminit „maagiline ruut” ilma tingimusteta, viitab see paaritu järgu, normaalsele, lihtsale maagilisele ruudule.

Maagilise ruudu genereerimise algoritm

Klassikaline algoritm paaritu järgu maagilise ruudu genereerimiseks, mida nimetatakse Siiami meetodiks, on järgmine:

  • Esimene arv (1) salvestatakse positsioonile (n/2, n-1), kus esimene koordinaat on reaindeks ja teine ​​on veeruindeks. Hilisemate sammude jaoks nimetage seda positsiooni (x, y).
  • Järgmine arv asetatakse punkti (x-1, y+1). Kui see positsioon on vale, rakendage järgmisi reegleid:
    1. Kui reaindeks on -1, murra see väärtuseks n-1. Kui veeruindeks on n, murra see väärtuseks 0.
    2. Kui arvutatud positsioonis on juba number, suurendage rea arvu 1 võrra ja vähendage veeru arvu 2 võrra.
    3. Kui rida on -1 ja veerg on n samal ajal, on uus positsioon (0, n-2).

Märge: See algoritm genereerib ainult paaritu järgu kehtivaid maagilisi ruute. Tulemuseks on tavaline maagiline ruut, mis sisaldab esimesi n² naturaalarvu. Sama n jaoks võib olla rohkem kui üks kehtiv lahend.

Reeglid saavad selgemaks väikese näite abil, kus on 3. järk, kus kasutatakse numbreid 1 kuni 9.

Kuidas see 3x3 ruudul töötab

Rakenduse algoritm ülaltoodud sammud on järgmised:

Step 1) Esimene arv (1) asetatakse kohale (3/2, 3-1) või (1, 2). Hilisemate sammude jaoks määrake x = 1 ja y = 2.

Magic Square'i loomise algoritm

Step 2) Ülejäänud numbrite positsioonid arvutatakse järgmiselt.

Numbri 2 asukoht:

Järgmine arv peaks minema (x-1, y+1) või (0, 3) juurde, mis ei ole kehtiv positsioon. Reegli (a) kohaselt murdub veerg nullini, saades (0, 0). Määrake x = 0, y = 0.

Magic Square'i loomise algoritm

Numbri 3 asukoht:

Arv 3 peaks asuma punktis (x-1, y+1) või (-1, 1), mis pole kehtiv positsioon. Reegli (a) kohaselt murdub rida punktini n-1 (mis on 2). Seega läheb number 3 punkti (2, 1). Määrake x = 2, y = 1.

Magic Square'i loomise algoritm

Numbri 4 asukoht:

Arv 4 peaks asuma punktis (x-1, y+1) või (1, 2), mis on kehtiv, aga sisaldab juba arvu 1. Reegli (b) kohaselt on uus positsioon (1+1, 2-2) või (2, 0). Määrake x = 2, y = 0.

Magic Square'i loomise algoritm

Numbri 5 asukoht:

Arv 5 peaks asuma punktis (x-1, y+1) või (1, 1), mis on kehtiv tühi positsioon. Määrake x = 1, y = 1.

Magic Square'i loomise algoritm

Numbri 6 asukoht:

Arv 6 peaks asuma punktis (x-1, y+1) või (0, 2), mis on kehtiv tühi positsioon. Määrake x = 0, y = 2.

Magic Square'i loomise algoritm

Numbri 7 asukoht:

Number 7 peaks asuma punktis (x-1, y+1) või (-1, 3), mis on vale. Reegli (c) kohaselt on uus positsioon (0, n-2) või (0, 1). Määrake x = 0, y = 1.

Magic Square'i loomise algoritm

Numbri 8 asukoht:

Arv 8 peaks asuma punktis (x-1, y+1) või (-1, 2), mis on vale. Reegli (a) kohaselt murdub rida punktini 2, saades tulemuseks (2, 2). Määrake x = 2, y = 2.

Magic Square'i loomise algoritm

Numbri 9 asukoht:

Number 9 peaks asuma punktis (x-1, y+1) või (1, 3), mis on vale. Reegli (a) kohaselt murdub veerg nullini, saades tulemuseks (1, 0).

Magic Square'i loomise algoritm

Iga täidetud lahtriga tõlgitakse sama loogika otse pseudokoodiks.

Maagilise ruudu pseudokood

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

Pseudokood seostub otse kompileeritud ja interpreteeritud keeltega, nagu on näidatud järgmises pildis. C++ ja Python.

C++ Code Maagilise ruudu jaoks

sisend:

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

Näite väljund:

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 Allolev versioon kasutab identseid rea- ja veerureegleid.

Python Code Maagilise ruudu jaoks

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)

Näite väljund:

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

Mõlemad rakendused toimivad identselt, mistõttu on nende maksumust lihtne võrrelda.

Keerukuse analüüs

  • Ruumi keerukus: Maagiline ruut on salvestatud n x n massiivis, seega on ruumi keerukus O(n²).
  • Aja keerukus: Generaator kasutab kahte pesastatud tsüklit. Välimine tsükkel töötab n korda ja sisemine tsükkel töötab samuti n korda, seega on üldine ajaline keerukus O(n²).

KKK

Tavalise 3x3 maagilise ruudu puhul, mis sisaldab numbreid 1 kuni 9, on maagiline konstant 15. Iga rea, veeru ja peadiagonaali summa peab olema 15, mis tuleneb valemist n(n²+1)/2, kus n on võrdne 3-ga.

Ei. Selles õpetuses näidatud Siiami meetod on defineeritud ainult paaritu järgu maagiliste ruutude jaoks. Paarisjärgud nõuavad erinevaid algoritme, näiteks kahekordselt paarisarvulisi (n jagub 4-ga) ja ühekordselt paarisarvulisi (n võrdub 4k+2) konstruktsioone, mis kasutavad erinevaid reegleid.

Generaator täidab n korda n maatriksi, seega on nii aja- kui ka ruumikeerukus O(n²). Iga lahtrit külastatakse konstantse arvu kordi ja salvestusruumi on täpselt n² täisarvu. See muudab algoritmi tüüpiliste meelelahutuslike suuruste puhul tõhusaks.

Tehisintellekti tehnikad, nagu geneetilised algoritmid, simuleeritud lõõmutamine ja piirangute rahuldamise lahendajad, suudavad otsida kehtivaid maagilisi ruute, kui suletud vormi meetodid ei kehti, sealhulgas paarisjärjekorrad, osalised ruudud ja variandid lisapiirangutega, näiteks ainult algarvudele või geomeetrilistele maagilistele ruutudele.

Maagilised ruudud on võrdlusülesanded kombinatoorse optimeerimise, tugevdusõppe agentide ja närviotsingu jaoks. Teadlased kasutavad neid heuristika, metaheuristika ja tehisintellekti planeerijate testimiseks struktureeritud diskreetsetel ruumidel, kuna lahendusi on lihtne kontrollida, kuid nende loendamine jääb lahtiseks matemaatiliseks probleemiks.

Võta see postitus kokku järgmiselt: