#include <iostream>
struct Matrix
{
int data[9];
// indices
// 0 1 2
// 3 4 5
// 6 7 8
};
int sumOfLine(Matrix& m, int lineNo) // 0, 1 or 2
{
return m.data[3*lineNo + 0] + m.data[3*lineNo + 1] + m.data[3*lineNo + 1];
}
int sumOfColumn(Matrix& m, int columnNo) // 0, 1 or 2
{
return m.data[columnNo + 3*0] + m.data[columnNo + 3*1] + m.data[columnNo + 3*2];
}
int sumOfForwardDiag(Matrix& m)
{
return m.data[6] + m.data[4] + m.data[2];
}
int sumOfBackwardDiag(Matrix& m)
{
return m.data[0] + m.data[4] + m.data[8];
}
bool isMagicSquare(Matrix& m)
{
bool isMagicSquare = true;
int targetSum = sumOfLine(m, 0);
for(int i=0; i<3; i++)
{
if(sumOfLine(m, i) != targetSum)
{
isMagicSquare = false;
}
}
for(int i=0; i<3; i++)
{
if(sumOfColumn(m, i) != targetSum)
{
isMagicSquare = false;
}
}
if(sumOfForwardDiag(m) != targetSum)
isMagicSquare = false;
if(sumOfBackwardDiag(m) != targetSum)
isMagicSquare = false;
return isMagicSquare;
}
int main(int argc, char* argv[])
{
Matrix m1 = { 0, 1, 2, 3, 4, 5, 6, 7, 8 };
Matrix m2 = { 1, 1, 1, 1, 1, 1, 1, 1, 1 };
std::cout << "m1 is magic: " << isMagicSquare(m1) << std::endl;
std::cout << "m2 is magic: " << isMagicSquare(m2) << std::endl;
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgoKc3RydWN0IE1hdHJpeAp7CiAgICBpbnQgZGF0YVs5XTsKICAgIC8vIGluZGljZXMKICAgIC8vIDAgMSAyCiAgICAvLyAzIDQgNQogICAgLy8gNiA3IDgKfTsKCmludCBzdW1PZkxpbmUoTWF0cml4JiBtLCBpbnQgbGluZU5vKSAgIC8vIDAsIDEgb3IgMgp7CiAgICByZXR1cm4gbS5kYXRhWzMqbGluZU5vICsgMF0gKyBtLmRhdGFbMypsaW5lTm8gKyAxXSArIG0uZGF0YVszKmxpbmVObyArIDFdOwp9CgppbnQgc3VtT2ZDb2x1bW4oTWF0cml4JiBtLCBpbnQgY29sdW1uTm8pIC8vIDAsIDEgb3IgMgp7CiAgICByZXR1cm4gbS5kYXRhW2NvbHVtbk5vICsgMyowXSArIG0uZGF0YVtjb2x1bW5ObyArIDMqMV0gKyBtLmRhdGFbY29sdW1uTm8gKyAzKjJdOwp9CgppbnQgc3VtT2ZGb3J3YXJkRGlhZyhNYXRyaXgmIG0pCnsKICAgIHJldHVybiBtLmRhdGFbNl0gKyBtLmRhdGFbNF0gKyBtLmRhdGFbMl07Cn0KCmludCBzdW1PZkJhY2t3YXJkRGlhZyhNYXRyaXgmIG0pCnsKICAgIHJldHVybiBtLmRhdGFbMF0gKyBtLmRhdGFbNF0gKyBtLmRhdGFbOF07Cn0KCmJvb2wgaXNNYWdpY1NxdWFyZShNYXRyaXgmIG0pCnsKICAgIGJvb2wgaXNNYWdpY1NxdWFyZSA9IHRydWU7CiAgICBpbnQgdGFyZ2V0U3VtID0gc3VtT2ZMaW5lKG0sIDApOwogICAgZm9yKGludCBpPTA7IGk8MzsgaSsrKQogICAgewogICAgICAgIGlmKHN1bU9mTGluZShtLCBpKSAhPSB0YXJnZXRTdW0pCiAgICAgICAgewogICAgICAgICAgICBpc01hZ2ljU3F1YXJlID0gZmFsc2U7CiAgICAgICAgfQogICAgfQogICAgCiAgICBmb3IoaW50IGk9MDsgaTwzOyBpKyspCiAgICB7CiAgICAgICAgaWYoc3VtT2ZDb2x1bW4obSwgaSkgIT0gdGFyZ2V0U3VtKQogICAgICAgIHsKICAgICAgICAgICAgaXNNYWdpY1NxdWFyZSA9IGZhbHNlOwogICAgICAgIH0KICAgIH0KICAgIAogICAgaWYoc3VtT2ZGb3J3YXJkRGlhZyhtKSAhPSB0YXJnZXRTdW0pCiAgICAgICAgaXNNYWdpY1NxdWFyZSA9IGZhbHNlOwogICAgCiAgICBpZihzdW1PZkJhY2t3YXJkRGlhZyhtKSAhPSB0YXJnZXRTdW0pCiAgICAgICAgaXNNYWdpY1NxdWFyZSA9IGZhbHNlOwogICAgCiAgICByZXR1cm4gaXNNYWdpY1NxdWFyZTsKfQoKaW50IG1haW4oaW50IGFyZ2MsIGNoYXIqIGFyZ3ZbXSkKewogICAgTWF0cml4IG0xID0geyAwLCAxLCAyLCAzLCA0LCA1LCA2LCA3LCA4IH07CiAgICBNYXRyaXggbTIgPSB7IDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEgfTsKICAgIAogICAgc3RkOjpjb3V0IDw8ICJtMSBpcyBtYWdpYzogIiA8PCBpc01hZ2ljU3F1YXJlKG0xKSA8PCBzdGQ6OmVuZGw7CiAgICBzdGQ6OmNvdXQgPDwgIm0yIGlzIG1hZ2ljOiAiIDw8IGlzTWFnaWNTcXVhcmUobTIpIDw8IHN0ZDo6ZW5kbDsKICAgIAogICAgcmV0dXJuIDA7Cn0=