#include <iostream>
#include <vector>
using namespace std;
void printMagicSquare(const vector<vector<int>>& magicSquare) {
for (const auto& row : magicSquare) {
for (int num : row) {
cout << num << "\t";
}
cout << endl;
}
}
bool isMagicSquare(const vector<vector<int>>& magicSquare) {
int magicSum = 0;
for (int i = 0; i < 4; ++i) {
magicSum += magicSquare[0][i]; // Suma de la primera fila
}
// Verificar filas
for (int i = 0; i < 4; ++i) {
int rowSum = 0;
for (int j = 0; j < 4; ++j) {
rowSum += magicSquare[i][j];
}
if (rowSum != magicSum) return false;
}
// Verificar columnas
for (int i = 0; i < 4; ++i) {
int colSum = 0;
for (int j = 0; j < 4; ++j) {
colSum += magicSquare[j][i];
}
if (colSum != magicSum) return false;
}
// Verificar diagonales
int diag1Sum = 0, diag2Sum = 0;
for (int i = 0; i < 4; ++i) {
diag1Sum += magicSquare[i][i]; // Diagonal principal
diag2Sum += magicSquare[i][3 - i]; // Diagonal secundaria
}
return (diag1Sum == magicSum && diag2Sum == magicSum);
}
int main() {
vector<vector<int>> magicSquare(4, vector<int>(4, 0));
// Llenar el cuadrado mágico de 4x4
int num = 1;
int i = 0, j = 2; // Comenzar en la primera fila, tercera columna
while (num <= 16) {
magicSquare[i][j] = num;
num++;
// Calcular la siguiente posición
int newi = (i - 1 + 4) % 4; // Mover hacia arriba
int newj = (j + 1) % 4; // Mover hacia la derecha
if (magicSquare[newi][newj] != 0) { // Si la posición ya está ocupada
i = (i + 1) % 4; // Mover hacia abajo
} else {
i = newi;
j = newj;
}
}
// Imprimir el cuadrado mágico
cout << "Cuadrado mágico 4x4:\n";
printMagicSquare(magicSquare);
// Verificar si es un cuadrado mágico
if (isMagicSquare(magicSquare)) {
cout << "El cuadrado mágico es válido." << endl;
} else {
cout << "El cuadrado mágico no es válido." << endl;
}
return 0;
}