•miculprogramator
|
|
« : Mai 02, 2009, 12:54:11 » |
|
Am urmatoarea cerinta: "Sa se scrie un prog. care verifica -printr-o singura parcurgere- daca o matrice cu n(n impar) linii si n coloane este patrat magic. Am ajuns la urmatoarea concluzie: -sa zicem ca n=5 np=n*n adica 25 if (n%2!=0) k=(int)np%2+1; else k=(int)np%2; si asa am aflat nr care trebuie pus in mijloc, in acest caz 13. suma care trebuie sa fie in patrat o aflu cu 5*13=65 adica s=n*k. Acum mai ramane problema cu parcurgerea...Am cautat si am gasit patratul: 11 24 7 20 3 4 12 25 8 16 17 5 13 21 9 10 18 1 14 22 23 6 19 2 15 Am observat ca elementele de pe diagonala principala sunt consecutive, iar cele de pe diagonala secunadra sunt +n.Adica: 3+5=8 8+5=13 13+5=18 18+5=23 Cum fac treaba cu o singura parcurgere?Mentionez ca nu am invatat inca functii...
|
|
|
Memorat
|
|
|
|
•alexandru92
|
|
« Răspunde #1 : Mai 02, 2009, 14:59:03 » |
|
poate te ajuta urmatoarea chestie: Un pătrat magic constă dintr-un tablou de numere aranjate în forma unui pătrat, astfel încât sumele elementelor din fiecare linie, coloană şi din cele două diagonale să fie identice; valoarea sumei se numeşte număr magic. Un pătrat magic este de ordin n dacă pe o latură a sa sunt aşezate n numere, iar în componenţa sa intră numerele 1, 2, 3…, n2; atunci numărul magic poate fi calculat cu formula: număr magic = n(n^2+1)/2.
|
|
|
Memorat
|
|
|
|
•miculprogramator
|
|
« Răspunde #2 : Mai 02, 2009, 15:50:51 » |
|
Exact acelasi lucru am facut si eu. Am probleme cu parcurgerea, nu cu aflarea nr magic (adica cel din centru).
|
|
|
Memorat
|
|
|
|
•gabor_oliviu1991
|
|
« Răspunde #3 : Mai 02, 2009, 17:04:19 » |
|
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:
11 10 4 23 17 18 12 6 5 24 25 19 13 7 1 2 21 20 14 8 9 3 22 16 15
|
|
|
Memorat
|
|
|
|
•miculprogramator
|
|
« Răspunde #4 : Mai 02, 2009, 17:20:32 » |
|
Asta am gasit si eu pe net, pe mine ma interseaza cum verific, nu cum construiesc un patrat magic.
|
|
|
Memorat
|
|
|
|
•alexandru92
|
|
« Răspunde #5 : Mai 02, 2009, 17:58:47 » |
|
Intr-un vector sumi -retii sumele de pe fiecare linie si de pe cele 2 diagonale, intr-un vector sumj retii sumele de toate coloanele , apoi verifici daca fiecare element din cei 2 vectori este egal cu n(n^2+1)/2 :d. Vectorii ii construiesti chiar de la citire => nu mai ai nevoie de matrice daca te chinui putin poti sa scapi de vectorul sumi
|
|
« Ultima modificare: Mai 02, 2009, 18:18:02 de către alexandru »
|
Memorat
|
|
|
|
•miculprogramator
|
|
« Răspunde #6 : Mai 02, 2009, 18:08:04 » |
|
Buna idee! O sa incerc si revin cu post.
|
|
|
Memorat
|
|
|
|
•miculprogramator
|
|
« Răspunde #7 : Mai 04, 2009, 18:47:45 » |
|
Ce nu e bine? #include <iostream.h> #include <conio.h> main() { clrscr(); int a[5][5]={11,24,7,20,3, 4,12,25,8,16, 17,5,13,21,9, 10,18,1,14,22, 13,6,19,2,15}; int n=5,i,j,g=1,sumi[5],sumj[5],sp,ss; for (i=0;i<n;i++) for (j=0;j<n;j++) { sumi[i]+=a[i][j]; sumj[j]=a[i][j]; sp+=a[i][i]; ss=a[i][n-1-i]; } for (i=0;i<n;i++) for (j=0;j<n;j++) if ( (sumi[i]!=sumj[j]) && (sumj[j]!=ss) &&(ss!=sp) ) g=0; if (g==1) cout<<"da!"; else cout<<"nu!"; getch(); }
|
|
|
Memorat
|
|
|
|
•toni2007
|
|
« Răspunde #8 : Mai 04, 2009, 19:54:26 » |
|
Pai, in primul rand tu adaugi la sp si ss de n ori aceeasi chestie. Tre sa mai compari ss cu sumi[1] si sumi[1] cu sumj[1]. De asemenea, la if-uri trebuie || in loc de &&. #include <iostream.h> #include <conio.h> main() { clrscr(); int a[5][5]={11,24,7,20,3, 4,12,25,8,16, 17,5,13,21,9, 10,18,1,14,22, 13,6,19,2,15}; int n=5,i,j,g=1,sumi[5],sumj[5],sp,ss; for (i=0;i<n;i++) for (j=0;j<n;j++) { sumi[i]+=a[i][j]; sumj[j]=a[i][j]; } for (i = 0; i < n; ++ i) { sp+=a[i][i]; ss=a[i][n-1-i]; } for (i=0;i<n;i++) for (j=0;j<n;j++) if ( (sumi[i]!=sumj[j]) || (sumj[j]!=ss) || (ss!=sp) ) g=0; if (sumi[1] != sumj[1] || sumi[1] != ss) g = 0; if (g==1) cout<<"da!"; else cout<<"nu!"; getch(); }
|
|
« Ultima modificare: Mai 05, 2009, 20:13:57 de către Pripoae Teodor Anton »
|
Memorat
|
|
|
|
•Florian
|
|
« Răspunde #9 : Mai 04, 2009, 20:16:06 » |
|
Iar sumi[] nu e initializata [ faci direct "sumi[ i ] += a[ i ] [ j ]; " ]
|
|
|
Memorat
|
|
|
|
•miculprogramator
|
|
« Răspunde #10 : Mai 04, 2009, 20:37:05 » |
|
Am modificat si asta si 13 acela din colt (care de fapt era 23) si afiseaza nu!
|
|
|
Memorat
|
|
|
|
•alexandru92
|
|
« Răspunde #11 : Mai 05, 2009, 16:43:49 » |
|
Uite un cod care merge :d /*si ,si2 retin suma de pe linii sumj[]-retin suma de pe coloane diags,diagp-retin suma de pe diagonale*/ #include<stdio.h> #define true 1 #define false 0 int n,i,j,x,si,si2,sumj[1000],diags,diagp; int main() {short ok=true; freopen("patratmagic.in","rt",stdin); freopen("patratmagic.out","wt",stdout); scanf("%d",&n); for(i=1;i<=n;++i) { si=0; for(j=1;j<=n;++j) { scanf("%d",&x); si+=x; sumj[j]+=x; if(i==j) diagp+=x; if(i+j==n+1) diags+=x; } if(i>1&&si!=si2) ok=false; si2=si; } if(!ok||diags!=diagp||diags!=si||diagp!=si) {printf("NU"); return 0;} for(i=1;i<=n&&ok;++i) if(sumj[i]!=si) ok=0; if(ok) printf("DA"); else printf("NU"); return 0; }
Daca nu-l intelegi pm :d La tine din cate am vazut: for (i = 1; i <= n; ++ i) ar trebuii sa inceapa de la 0 ...n-1 ss=a[ i ][ n-1-i ]; ss+=a[ i ][ n-1-i ];
|
|
« Ultima modificare: Mai 05, 2009, 17:08:39 de către alexandru »
|
Memorat
|
|
|
|
•toni2007
|
|
« Răspunde #12 : Mai 05, 2009, 20:14:16 » |
|
Mdea, asa e, greseala mea.
|
|
|
Memorat
|
|
|
|
•miculprogramator
|
|
« Răspunde #13 : Mai 06, 2009, 17:06:54 » |
|
Salut! Am rezolvat problema altfel: clrscr(); int a[5][5]={11,24,7,20,3, 4,12,25,8,16, 17,5,13,21,9, 10,18,1,14,22, 23,6,19,2,15}; int n=5,i,j,gl=1,gc=1,x,sumi[]={0,0,0,0,0},sumj[]={0,0,0,0,0},sumt=0,k; for (i=0;i<n;i++) for (k=0;k<n;k++) { sumi[i]+=a[i][k]; sumj[i]+=a[k][i]; } for (i=0;i<n;i++) sumt+=sumi[i];
x=int(n/2); cout<<"x="<<x<<endl; cout<<"mijlocul este:"<<a[x][x]<<endl; cout<<"sumt="<<sumt<<endl ; if (sumt==n*a[x][x]*n) cout<<"suma totala corecta"<<endl; else cout<<"suma totala gresita"<<endl;
if ( a[x][x]==(int)((n*n)/2)+1 ) cout<<"mijlocul este corect"<<endl; else cout<<"mijlocul nu este corect"<<endl;
for (i=0;i<n;i++) { cout<<sumi[i]<<" "; if (sumi[i]!=n*a[x][x]) gl=0; } if (gl) cout<<"indeplineste a2a conditie"; else cout<<"nu a2a conditie"; cout<<endl; for (i=0;i<n;i++) { cout<<sumj[i]<<" "; if (sumj[i]!=n*a[x][x]) gc=0; } if (gc) cout<<"indeplineste a3a conditie"; else cout<<"nu a 3a conditie"; getch(); }
|
|
|
Memorat
|
|
|
|
|