Написать функцию генерации магического квадрата
Суть задания:проверить является ли заданная матрица 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;
}