#include <iostream>
int main()
{
int magicsq[3][3] = {0}; // initializes magic square with all 0s
// Algorithm of de la Loubere:
int row = 0, col = 1; // start coordinates
// assign start cell
magicsq[row][col] = 1;
for (int x = 2; x <= 9; ++x) {
// compute up-right coordinates
int rowT = row - 1; if (rowT < 0) rowT += 3;
int colT = col + 1; if (colT >= 3) colT -= 3;
// check whether cell not yet assigned
if (magicsq[rowT][colT]) {
// compute down coordinates
if (++row >= 3) row -= 3;
} else {
// use up-right coordinates
row = rowT; col = colT;
}
// assign next cell
magicsq[row][col] = x;
}
// output of result:
std::cout << "Magic Square:" << std::endl;
for (row = 0; row < 3; ++row) {
for (col = 0; col < 3; ++col) {
std::cout << ' ' << magicsq[row][col];
}
std::cout << std::endl;
}
// check result:
std::cout << "Row sums:";
for (row = 0; row < 3; ++row) {
int sum = 0;
for (col = 0; col < 3; ++col) sum += magicsq[row][col];
std::cout << ' ' << sum;
}
std::cout << std::endl;
std::cout << "Column sums:";
for (col = 0; col < 3; ++col) {
int sum = 0;
for (row = 0; row < 3; ++row) sum += magicsq[row][col];
std::cout << ' ' << sum;
}
std::cout << std::endl;
std::cout << "Diagonal sums: ";
int sumM = 0, sumC = 0;
for (row = 0; row < 3; ++row) {
sumM += magicsq[row][row];
sumC += magicsq[row][2 - row];
}
std::cout << ' ' << sumM << ' ' << sumC << std::endl;
// done
return 0;
}