Last active
December 17, 2015 10:58
-
-
Save ehgoodenough/5598205 to your computer and use it in GitHub Desktop.
A magic square is an array of numbers where the sum of each column or row return the same value. This class can analyze the array for a magic square.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
class Square | |
{ | |
private: | |
const int size; | |
int* grid; | |
public: | |
Square() : size(4) {grid = new int[size * size];} | |
Square(int size) : size(size) {grid = new int[size * size];} | |
void setNode(int value, int x, int y) {grid[y * size + x] = value;} | |
int getNode(int x, int y) {return grid[y * size + x];} | |
int getSize() {return size;} | |
bool isMagic() {return hasMagicSums() && hasMagicNumbers()} | |
int getRowSum(int row) | |
{ | |
int sum = 0; for(int aee = 0; aee < size; aee++) | |
{sum += getNode(row,aee);} return sum; | |
} | |
int getColumnSum(int column) | |
{ | |
int sum = 0; for(int aee = 0; aee < size; aee++) | |
{sum += getNode(aee,column);} return sum; | |
} | |
int getCornerSum(int corner) | |
{ | |
int sum = 0; for(int aee = 0; aee < size; aee++) | |
{int iee = (corner > 0) ? (0 + aee) : (size - aee - 1); | |
sum += getNode(iee, aee);} return sum; | |
} | |
int hasMagicSums() | |
{ | |
int* allSums = new int[size * 2 + 2]; | |
for(int iee = 0; iee < size; iee++) {allSums[iee] = getRowSum(iee);} | |
for(int oee = 0; oee < size; oee++) {allSums[size + oee] = getColumnSum(oee);} | |
allSums[size * 2] = getCornerSum(-1); allSums[size * 2 + 1] = getCornerSum(1); int sampleSum = allSums[0]; | |
for(int aee = 1; aee < size * 2 + 2; aee++) {if(allSums[aee] != sampleSum) {return false;}} | |
return true; | |
} | |
bool hasMagicNumbers() | |
{ | |
bool* everyNumber = new bool[size * size]; | |
for(int aee = 0; aee < size * size; aee++) {everyNumber[aee] = false;} | |
for(int iee = 0; iee < size; iee++) {for(int oee = 0; oee < size; oee++) | |
{ | |
if(getNode(iee,oee) > size * size) {return false;} | |
if(everyNumber[getNode(iee,oee) - 1] == true) {return false;} | |
everyNumber[getNode(iee,oee) - 1] = true; | |
}} | |
return true; | |
} | |
}; |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment