👤

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ăspuns :

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:

Vă mulțumim pentru vizita pe site-ul nostru dedicat Informatică. Sperăm că informațiile oferite v-au fost de ajutor. Nu ezitați să ne contactați pentru orice întrebare sau dacă aveți nevoie de asistență suplimentară. Vă așteptăm cu drag data viitoare și nu uitați să ne adăugați la favorite!


ID Learners: Alte intrebari