C/C++

Программирование C++. Двумерные массивы

Написать код к задаче: Дана целая квадратная матрица. Определить, является ли она “магическим квадратом”. “Магический квадрат” - это квадратная матрица размера NxN, составленная из чисел от 1 до n^2, так что суммы по каждому столбцу, каждой строке и каждой из двух больших диагоналей равны между собой.
#include<iostream>
#include<set>
using namespace std;

bool is_magik(int32_t** mas, size_t size)
{
set<int32_t>numeric;
for (size_t i = 0; i < size; i++)for (size_t j = 0; j < size; j++)numeric.insert(mas[i][j]);
if (numeric.size() != size * size || *numeric.begin() != 1 || *--numeric.end() != size * size) return false; //check sequence
size_t sum{}, sum_other{}, sum_diag1{},sum_diag2{};
for (size_t i = 0; i < size; i++) sum += mas[0][i];
for (size_t i = 1; i < size; i++) //check str
{
for (size_t j = 0; j < size; j++)sum_other += mas[i][j];
if (sum_other != sum) return false; sum_other = 0;
}
for (size_t i = 0; i < size; i++) //chek col
{
for (size_t j = 0; j < size; j++)sum_other += mas[j][i];
if (sum_other != sum) return false; sum_other = 0;
sum_diag1 += mas[i][i]; sum_diag2 += mas[size - i - 1][i];
}
if (sum_diag1 != sum_diag2 || sum_diag1 != sum) return false; //chek diag
return true;
}

int main()
{
int num[16]{ 7,12,1,14,2,13,8,11,16,3,10,5,9,6,15,4 }; //пример
const int size = 4; //пример
int** m = new int* [size];
for (int i = 0; i < size; i++) m[i] = new int[size];
for (int i = 0; i < size; i++)for (int j = 0; j < size; j++)m[i][j] = num[i * size + j];
cout << (is_magik(m, size)?"Is magic!":"Is not magic!");
}
АМ
Александр Мазуренко
51 416
Лучший ответ
Считаешь строки, например 1-ая строка в массиве это 00 01 02 03 04, 1-ый столбец 00 10 20 30 04, диагональ сверху слева к направо вниз 00 11 22 33 44, диагональ сверху справа к низу слева 04 13 22 31 40.

00 это типо array[0][0]

Вообще, задача лёгкая, нужно немного подумать, поработать с циклами, описания выше должно быть достаточно