Constructia unui patrat magic impar
Problema:
Sa se construiasca un patrat magic de dimensiune n ( cu n impar), adica o matrice cu n linii si n coloane avand ca elemente numerele naturale 1, 2, , n^2 astfel incat sumele elementelor pe linii, pe coloane si pe cele doua diagonale sa fie identice.
Introducere:
Un patrat magic consta dintr-un tablou de numere aranjate in forma unui patrat, astfel incat sumele elementelor din fiecare linie, coloana si din cele doua diagonale sa fie identice; valoarea sumei se numeste numar magic. Un patrat magic este de ordin n daca pe o latura a sa sunt asezate n numere, iar in componenta sa intra numerele 1, 2, 3., n ; atunci numarul magic poate fi calculat cu formula: numar magic = n(n
Exista un singur patrat magic de ordinul 3 (cu toate ca prin rotatii si simetrii pot fi obtinute 8 astfel de patrate):
3 8
9 5 1
2 7 6
Patratele magice de ordin 4 sunt in numar de 880 (7040 daca sunt considerate si rotatiile si simetriile), iar numarul patratelor magice de ordin 5 este de circa 13.000.000.
Sunt cunoscute mai multe metode de obtinere a patratelor magice, ele diferind pentru patratele de ordin par, respectiv impar.
Metoda:
O metoda foarte simpla consta in urmatoarele actiuni:
Se plaseaza 1 in centrul ultimei coloane;
Se merge in linie oblica, dreapta-jos, cu numarul urmator; daca se iese din patrat prin partea dreapta, se merge in partea opusa, in stanga liniei unde trebuia depus numarul, iar daca se iese prin partea de jos a patratului, se merge in partea de sus a coloanei unde trebuia depus numarul;
Dupa ce se completeaza un grup de n numere, se merge cu o casuta spre stanga, pe aceeasi linie, pentru a se repeta apoi pasul 2 si a genera urmatorul grup de n numere.
Se obtine in final urmatorul patrat magic:
10 4 23 17
18 12 6 5 24
25 19 13 7 1
2 21 20 14 8
9 3 22 16 15
Despre program:
Programul permite 2 tipuri de afisare a patratului magic:
Direct
programul afiseaza patratul chiar daca nu o sa incapa pe ecran
Pas cu pas
dupa fiecare numar afisat trebuie apasata o tasta
se vor afisa numai patratele cu n<15. Pentru n>15 afisarea se va face numai in mod 'Direct
Sursa programului:
#include <stdio.h>#include <conio.h>unsigned char m[200][200];int n;
void af()void mod_1()
else
m[i][j]=(unsigned char)nr;
}
af();
void mod_2()
int poz=wherey()-1;
int i=n/2+1,j=1;
for (int nr=1;nr<=n*n;nr++)
else
gotoxy(j*4,poz+i);
printf('%3d ',nr);
getch();
}
gotoxy(1,poz+n);
void main(void)
else printf('Ati introdus un numar par');
printf('nContinuati? (d/n) ');c=getch();
}while (c!='n');