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
#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;
}