Informatică, întrebare adresată de Teodora2301, 8 ani în urmă

Un Pătrat Magic este un pătrat ce conține numerele de la 1 la n 2 în care sumele fiecăror linii, coloane și a celor două diagonale sunt egale. Această sumă se mai numește și constanta pătratului magic.

Pătrat Magic cu constanta 15

Cerința
Se dă un număr natural n, urmat de o matrice pătratică cu n * n elemente, numere naturale. Să se verifice dacă matricea dată este un pătrat magic.

Date de intrare
Programul citește de la tastatură numărul n, iar apoi n * n numere naturale, reprezentând elementele matricei.

Date de ieșire
Programul va afișa pe ecran true dacă matricea dată este un pătrat magic sau false dacă nu este.

Restricții și precizări
3 ≤ n ≤ 500
cele n numere citite vor fi mai mici sau egale decât 250.000



Exemplu
Intrare

3
4 9 2
3 5 7
8 1 6
Ieșire

true

Răspunsuri la întrebare

Răspuns de suciusergiusuciuserg
9

Răspuns:

patrat_magic1

#include <bits/stdc++.h>

using namespace std;

/**  # desen tehnic

   0 0 N N N N 0 0

   0 0 N N N N 0 0

   V V 0 0 0 0 E E

   V V 0 0 0 0 E E

   V V 0 0 0 0 E E

   V V 0 0 0 0 E E

   0 0 S S S S 0 0

   0 0 S S S S 0 0

**/

int main()

{

   int nr = 1, n, a[101][101];

   cin>>n;

   /// generare clasica

   for(int i=0;i<n;++i)

       for(int j=0;j<n;++j)

           a[i][j] = nr++;

   /// vom roti elem patratului din zonele N, S, E si V cu 180 grade

   /// N - S

   for(int k=0; k<n/4; ++k)

   {

       int pas = 1;

       for(int x=k, y=n/4, i=n-k-1, j=3*n/4-1; pas<=n/2; ++y, --j, ++pas)

           swap(a[x][y], a[i][j]);

   }

   /// V - E

   for(int k=0; k<n/4; ++k)

   {

       int pas = 1;

       for(int x=n/4, y=k, i=3*n/4-1, j=n-k-1; pas<=n/2; ++x, --i, ++pas)

           swap(a[x][y], a[i][j]);

   }

   /// afisare

   for(int i=0;i<n;++i)

   {

       for(int j=0;j<n;++j)

           cout<<a[i][j]<<' ';

       cout<<'\n';

   }

   return 0;

}

patrat_magic0

#include <iostream>

using namespace std;

bool f[1000000];

int a[1000][1000];

int main()

{

   int n;

   bool magic = true;

   cin>>n;

   for(int i=0;i<n;++i)

       for(int j=0;j<n;++j){

           cin>>a[i][j];

           if(a[i][j]>n*n || a[i][j]<1) magic = false;

           if(f[a[i][j]] == 0) f[a[i][j]] = 1;

           else magic = false;

       }

   int s, c;

   /// diagonalele + constanta

   int s1 = 0, s2 = 0;

   for(int i=0;i<n;++i)

       s1+=a[i][i], s2+=a[i][n-i-1];

   if(s1!=s2) magic = false, c=0;

   else c = s1;

   /// liniile

   for(int i=0;i<n;++i)

   {

       s=0;

       for(int j=0;j<n;++j)

           s+=a[i][j];

       if(s!=c) magic = false;

   }

   /// coloanele

   for(int i=0;i<n;++i)

   {

       s=0;

       for(int j=0;j<n;++j)

           s+=a[j][i];

       if(s!=c) magic = false;

   }

   cout<<boolalpha<<magic;

   return 0;

}

Explicație:


suciusergiusuciuserg: am pus din greseala rezolvarea la patrat_magic1
Alte întrebări interesante