Informatică, întrebare adresată de razvanlozonschi123, 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.

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.000Exemplu
Intrare

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

true

#3124

Răspunsuri la întrebare

Răspuns de Petruccinator
5

#include <iostream>

#include <fstream>

bool magic(const int* in, const int n)

{

   int i, j, res[4]={0};

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

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

           res[0] += in[i * n + j];

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

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

           res[1] += in[i * n + j];

   if(res[1] != res[0])

       return false;

   res[0] /= n; res[1] /= n;

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

       res[2] += in[i * n + i];

   if(res[2] != res[1])

       return false;

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

       res[3] += in[i * n + (n - i - 1)];

   if(res[3] != res[2])

       return false;

   return true;

}

int main()

{

   int *vec;

   std::ifstream fin("magic.in");

   std::ofstream fout("magic.out");

   int n;

   if(fin >> n){

       vec = new int[n * n];

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

           fin >> vec[i];

   }

   fout << (magic(vec, n) ? "true" : "false");

   fin.close();

   fout.close();

   delete[] vec;

   return 0;

}

Alte întrebări interesante