#include <iostream>
using namespace std;
#define SQUARE_SIZE 9
int anyLine = 0;
int currLine = 0;
int numSolutions = 0;
// swap two values in the square.
void swap (int arr[], int idxa, int idxb)
{
int tmp = arr[idxa];
arr[idxa] = arr[idxb];
arr[idxb] = tmp;
}
void printArray(int arr[])
{
for (int i = 0; i < SQUARE_SIZE; i++)
{
cout << arr[i] << " ";
if((i+1) % 3 == 0)
cout << endl;
}
cout << endl;
}
// this function tests to see if we have a "good" arrangment of numbers
// i.e the sum of each row, colum and diagonal is equal
bool checkArr(int arr[])
{
anyLine = arr[0] + arr[1] + arr[2];
currLine = 0;
for (int i = 0; i < SQUARE_SIZE; i++)
{
currLine += arr[i];
if((i+1) % 3 == 0)
{
if (currLine != anyLine)
return false;
currLine = 0;
}
}
// check vertically
for (int col = 0; col <3; col++)
{
for (int row = 0; row <3; row++)
{
currLine += arr[col + 3 * row];
}
if (currLine != anyLine)
return false;
currLine = 0;
}
// check the diagonals
if ((arr[2] + arr[4] + arr[6]) != anyLine)
return false;
if ((arr[0] + arr[4] + arr[8]) != anyLine)
return false;
return true;
}
void solve(int arr[], int pos)
{
if (pos == 8)
{
if (checkArr(arr))
{
printArray(arr);
numSolutions++;
}
}else
{
for (int i = pos ; i < 9; i++)
{
/*if (checkArr(arr))
{
printArray(arr);
numSolutions++;
}*/
//if (i == pos) continue;
swap(arr,pos,i);
solve(arr,pos +1);
swap(arr,pos,i);
}
}
}
int main()
{
int arr[SQUARE_SIZE]= { 1,2,3,4,5,6,7,8,9 };
solve(arr,0);
cout << "number of solutions is: " << numSolutions<< endl;
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgp1c2luZyBuYW1lc3BhY2Ugc3RkOwojZGVmaW5lIFNRVUFSRV9TSVpFIDkKCmludCBhbnlMaW5lID0gMDsKaW50IGN1cnJMaW5lID0gMDsKaW50IG51bVNvbHV0aW9ucyA9IDA7CgoKLy8gc3dhcCB0d28gdmFsdWVzIGluIHRoZSBzcXVhcmUuCnZvaWQgc3dhcCAoaW50IGFycltdLCBpbnQgaWR4YSwgaW50IGlkeGIpCnsKICBpbnQgdG1wID0gYXJyW2lkeGFdOwogIGFycltpZHhhXSA9IGFycltpZHhiXTsKICBhcnJbaWR4Yl0gPSB0bXA7Cn0KCiB2b2lkIHByaW50QXJyYXkoaW50IGFycltdKQogewogICBmb3IgKGludCBpID0gMDsgaSA8IFNRVUFSRV9TSVpFOyBpKyspCiAgewogICAgY291dCA8PCBhcnJbaV0gPDwgIiAiOwogICAgaWYoKGkrMSkgJSAzID09IDApCiAgICAgICAgY291dCA8PCBlbmRsOwogIH0KICBjb3V0IDw8IGVuZGw7CiB9CgovLyB0aGlzIGZ1bmN0aW9uIHRlc3RzIHRvIHNlZSBpZiB3ZSBoYXZlIGEgImdvb2QiIGFycmFuZ21lbnQgb2YgbnVtYmVycyAgICAgICAgICAgIAovLyAgIGkuZSB0aGUgc3VtIG9mIGVhY2ggcm93LCBjb2x1bSBhbmQgZGlhZ29uYWwgaXMgZXF1YWwKCmJvb2wgY2hlY2tBcnIoaW50IGFycltdKQp7CiAgYW55TGluZSA9IGFyclswXSArIGFyclsxXSArIGFyclsyXTsKICBjdXJyTGluZSA9IDA7CiAgZm9yIChpbnQgaSA9IDA7IGkgPCBTUVVBUkVfU0laRTsgaSsrKQogIHsKICAgIGN1cnJMaW5lICs9IGFycltpXTsKICAgIGlmKChpKzEpICUgMyA9PSAwKQogICAgewogICAgICAgIGlmIChjdXJyTGluZSAhPSBhbnlMaW5lKQogICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICBjdXJyTGluZSA9IDA7CiAgICB9CiAgfQogIC8vIGNoZWNrIHZlcnRpY2FsbHkKICBmb3IgKGludCBjb2wgPSAwOyBjb2wgPDM7IGNvbCsrKQogewogICAgZm9yIChpbnQgcm93ID0gMDsgcm93IDwzOyByb3crKykKICAgIHsKICAgICAgICBjdXJyTGluZSArPSBhcnJbY29sICsgMyAqIHJvd107CiAgICB9CiAgICBpZiAoY3VyckxpbmUgIT0gYW55TGluZSkKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgY3VyckxpbmUgPSAwOwogIH0KCiAgLy8gY2hlY2sgdGhlIGRpYWdvbmFscwogIGlmICgoYXJyWzJdICsgYXJyWzRdICsgYXJyWzZdKSAhPSBhbnlMaW5lKQogICAgcmV0dXJuIGZhbHNlOwoKICBpZiAoKGFyclswXSArIGFycls0XSArIGFycls4XSkgIT0gYW55TGluZSkKICAgIHJldHVybiBmYWxzZTsKCiAgcmV0dXJuIHRydWU7CiB9Cgogdm9pZCBzb2x2ZShpbnQgYXJyW10sIGludCBwb3MpCiB7CgogIGlmIChwb3MgPT0gOCkKIHsKCiBpZiAoY2hlY2tBcnIoYXJyKSkKIHsKICAgIHByaW50QXJyYXkoYXJyKTsKICAgIG51bVNvbHV0aW9ucysrOwogfQoKfWVsc2UKewpmb3IgKGludCBpID0gcG9zIDsgaSA8IDk7IGkrKykKeyAKCiAgICAvKmlmIChjaGVja0FycihhcnIpKQogICAgewogICAgICAgIHByaW50QXJyYXkoYXJyKTsKICAgICAgICBudW1Tb2x1dGlvbnMrKzsKICAgIH0qLwogICAgCiAgICAvL2lmIChpID09IHBvcykgY29udGludWU7CiAgICAKICAgICAgIHN3YXAoYXJyLHBvcyxpKTsKICAgICAgIHNvbHZlKGFycixwb3MgKzEpOwogICAgICAgc3dhcChhcnIscG9zLGkpOwoKICAgIH0KICB9Cn0KCmludCBtYWluKCkKewoKaW50IGFycltTUVVBUkVfU0laRV09IHsgMSwyLDMsNCw1LDYsNyw4LDkgfTsKCnNvbHZlKGFyciwwKTsKY291dCA8PCAibnVtYmVyIG9mIHNvbHV0aW9ucyBpczogIiA8PCBudW1Tb2x1dGlvbnM8PCBlbmRsOwoKcmV0dXJuIDA7Cn0K