Написать функцию генерации магического квадрата

Суть задания:проверить является ли заданная матрица n x n магическим квадратом и написать функцию генерации магического квадрата. Я написал функцию проверки ввёденного массива с клавиатуры, но только для квадрата 3 на 3, желательно реализовать это для размерности матрицы введённой с клавиатуры. Только начинаю работать с функциями, пока слабовато даётся, буду безмерно благодарен за любую помощь.

Код:

#include <iostream>
using namespace std;

const int n = 3;
void magic(int summ[], int massiv[][n], int sizemas) {
    int i = 0, j = 0;
    for (i = 0; i < sizemas; i++) {
        for (j = 0; j < sizemas; j++) {
            summ[i] += massiv[i][j];
            summ[j + 3] += massiv[i][j];
            if (i == j) 
                summ[6] += massiv[i][j];
            if (i + j == 2)
                summ[7] += massiv[i][j];
        }
    }
    for (int i = 0; i < 7; i++) {
        if (summ[i] != summ[i + 1]) {
            cout << "Данный квадрат не является магическим.";
            return;
        }
    }
    cout << "Данный квадрат является магическим!" << endl;
}

void fillMagic(int mas[][n], int n) {
    int i = 0, j = 0;
    srand(time(NULL));
    for (i = 0; i < n; i++) {
        for (j = 0; j < n; j++) {
            cin >> mas[i][j];
        }
    }
}

int main() {
    setlocale(0, "");

    int arr[n][n];
    int sum[8] = {0};

    fillMagic(arr, n);
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < n; j++) {
            cout << arr[i][j] << "  ";
        }
        cout << endl;
    }
    magic(sum, arr, n);
    
    return 0;
}

Ответы (2 шт):

Автор решения: Павел Ериков

Вот пока, что только проверка квадратной матрицы на "Магический квадрат" для матриц любой размерности:

bool isMagical(int** matrix, int dimension) {
//Сумма с которой мы будем сравнивать остальные получившиеся суммы
int f_summa = 0;
//Сумма главной диагонали
for (int i = 0; i < dimension; ++i)
    f_summa += matrix[i][i];

int s_summa = 0;
//Сумма побочной диагонали
for (int i = 0; i < dimension; ++i)
    s_summa += matrix[i][dimension - i - 1];
if (s_summa != f_summa) return false;

//Сумма строк
for (int i = 0; i < dimension; ++i) {
    s_summa = 0;
    for (int j = 0; j < dimension; ++j)
        s_summa += matrix[i][j];
    if (s_summa != f_summa) return false;
}

//Сумма столбцов
for (int i = 0; i < dimension; ++i) {
    s_summa = 0;
    for (int j = 0; j < dimension; ++j)
        s_summa += matrix[j][i];
    if (s_summa != f_summa) return false;
}

return true;
}

Продолжение следует...

→ Ссылка
Автор решения: AR Hovsepyan

Проверить является ли квадратная матрица магическим квадратом, можно проверить в одном цикле:

bool magic(int** arr, const int n) {
    //магическая константа сумм чисел строк столбцов, диагоналей
    //если эти суммы различны, значит это не магический квадрат
    const int Magic_const = (n * (n * n + 1)) / 2;
    int sumr = 0,   //сумма строк
        sumcol = 0, //сумма столбцов
        sumd = 0,   //главная диагональ
        sums = 0;   //побочная диагональ
    for (int i = 0; i < n; ++i) {
        for (int j = 0; j < n; ++j) {            
            sumr += arr[i][j];
            sumcol += arr[j][i];
        }
        if (sumr != Magic_const || sumcol != Magic_const )
            return false;
        //для следующего столбца и строки
        sumr = 0; 
        sumcol = 0;
        // главная диагональ
        sumd += arr[i][i];
        //побочная диагональ
        sums += arr[n - i][i];
    }
    if (sumd != Magic_const || sums != Magic_const)
        return false;
    return true;
}
→ Ссылка