C++ Almost Magic Square
#include <algorithm>
#include <array>
#include <vector>
std::vector<int> almostMagicSquare(const std::vector<int>& a)
{
std::array<std::array<int, 3>, 3> grid{};
for (int i = 0; i < 3; ++i) {
for (int j = 0; j < 3; ++j) {
grid[i][j] = a[i * 3 + j];
}
}
std::array<int, 3> rowSum{};
std::array<int, 3> colSum{};
int maxSum = 0;
for (int i = 0; i < 3; ++i) {
for (int j = 0; j < 3; ++j) {
rowSum[i] += grid[i][j];
colSum[i] += grid[j][i];
}
}
for (int k = 0; k < 3; ++k) {
maxSum = std::max(maxSum, rowSum[k]);
maxSum = std::max(maxSum, colSum[k]);
}
for (int i = 0, j = 0; i < 3 && j < 3;) {
int diff = std::min(maxSum - rowSum[i], maxSum - colSum[j]);
grid[i][j] += diff;
rowSum[i] += diff;
colSum[j] += diff;
if (rowSum[i] == maxSum) {
++i;
}
if (colSum[j] == maxSum) {
++j;
}
}
std::vector<int> result;
result.reserve(9);
for (int i = 0; i < 3; ++i) {
for (int j = 0; j < 3; ++j) {
result.push_back(grid[i][j]);
}
}
return result;
}
This adjusts the matrix toward a matching target sum so the rows and columns line up more like a magic square.