A 2x2 matrix in which the sum of all columns, rows and diagonals equals to the same number.
- Each entry is a distinct item in
- Where the magic constant that all rows and columns sum to is equal to
Solving Magic Square with C Program
////////////////////////////////////////////////
// CSC A48 - Exercise 5 - Solving Magic Squares
//
// (c) F. Estrada
////////////////////////////////////////////////
#include<stdio.h>
#include<stdlib.h>
void solveMagicSquare(int square[6][6])
{
// we assume that atleast one row/column has the magic constant as the sum. if not, then this matrix is unsolvable
int constants[12];
int constants_counter = 0;
int unknowns_to_solve = 0;
// rows
for (int row = 0; row < 6; row++){
int tempsum = 0;
for (int col = 0; col < 6; col++){
tempsum += square[row][col];
// adding unknowns number
if (square[row][col] == -1){
unknowns_to_solve++;
}
}
constants[constants_counter] = tempsum;
constants_counter++;
}
// columns
for (int col = 0; col < 6; col++){
int tempsum = 0;
for (int row = 0; row < 6; row++){
tempsum += square[row][col];
}
constants[constants_counter] = tempsum;
constants_counter++;
}
// diagonals
int tempsum = 0;
for (int i = 0; i < 6; i++){
tempsum += square[i][i];
}
constants[constants_counter] = tempsum;
constants_counter++;
tempsum = 0;
for (int i = 5; i >= 0; i--){
tempsum += square[5-i][i];
}
constants[constants_counter] = tempsum;
constants_counter++;
// find the maximum magic constant
int magic_const = 0;
for (int i = 0; i < constants_counter; i++){
if (constants[i] > magic_const){
magic_const = constants[i];
}
}
//printf("magic const is: %d\n", magic_const);
//printf("number of unknowns: %d\n", unknowns_to_solve);
// try to solve for the rows/columns/diagonals with only one -01 first
int num_is = 0;
int i_index = 0;
int row_sum = 0;
while (unknowns_to_solve > 0){
// check each row for single -1
//printf("checking rows, unknowns_to_solve is: %d\n", unknowns_to_solve);
for (int row = 0; row < 6; row++){
num_is = 0;
i_index = 0;
row_sum = 0;
for (int col = 0; col < 6; col++){
//getting number of 1s
if (square[row][col] == -1){
num_is++;
i_index = col;
}
else {
row_sum += square[row][col];
}
}
// 1. check if only one -1
if (num_is == 1){
square[row][i_index] = magic_const - row_sum;
unknowns_to_solve--;
}
}
// check each column for single -1
//printf("checking columns, unknowns_to_solve is: %d\n", unknowns_to_solve);
for (int col = 0; col < 6; col++){
num_is = 0;
i_index = 0;
row_sum = 0;
for (int row = 0; row < 6; row++){
//getting number of 1s
if (square[row][col] == -1){
num_is++;
i_index = row;
}
else {
row_sum += square[row][col];
}
}
// 1. check if only one -1
if (num_is == 1){
square[i_index][col] = magic_const - row_sum;
unknowns_to_solve--;
}
}
// check each diagonal for single -1
//printf("checking diagonals, unknowns_to_solve is: %d\n", unknowns_to_solve);
row_sum = 0;
num_is = 0;
i_index = 0;
for (int i = 5; i >= 0; i--){
if (square[5-i][i] == -1){
num_is++;
i_index = i;
}
else{
row_sum += square[5-i][i];
}
}
if (num_is == 1){
square[5-i_index][i_index] = magic_const - row_sum;
}
// other diagonal
//printf("checking diagonals, unknowns_to_solve is: %d\n", unknowns_to_solve);
row_sum = 0;
num_is = 0;
i_index = 0;
for (int i = 0; i < 6; i++){
if (square[i][i] == -1){
num_is++;
i_index = i;
}
else{
row_sum += square[i][i];
}
}
if (num_is == 1){
square[i_index][i_index] = magic_const - row_sum;
}
//printf("current iteration done with unknowns_to_solve: %d\n", unknowns_to_solve);
}
}
// DO NOT MODIFY ANYTHING BELOW THIS LINE!
// (we mean it! the auto-checker won't be happy)
void printMagicSquare(int square[6][6])
{
// Prints out the contents of a magic square 6x6
int i,j,sum;
for (i=0; i<6; i++)
{
sum=0;
for (j=0; j<6; j++)
{
printf("%03d, ",square[i][j]);
sum=sum+square[i][j];
}
printf(" : %03d\n",sum);
}
printf("---------------------------\n");
for (j=0; j<6; j++)
{
sum=0;
for (i=0; i<6; i++)
{
sum=sum+square[i][j];
}
printf("%03d, ",sum);
}
printf("\n");
}
#ifndef __testing // This is a compiler directive - used by the auto-checker to enable/disable this part of the code
int main()
{
int magic[6][6]={{32,29,4,1,24,21},{30,-1,2,3,-1,23},{12,9,17,20,28,25},{10,11,18,-1,26,27},{13,-1,36,33,5,8},{14,15,34,35,6,-1}};
printMagicSquare(magic);
printf("Solving Magic Square!\n");
solveMagicSquare(magic);
printMagicSquare(magic);
return 0;
}
#endif