1. Computing & Technology

Discuss in my forum

Doubly-Even Magic Squares

By , About.com Guide

Doubly-Even Magic Squares Solution

Your program should have been capable of creating the 8x8 magic square below:

  1  2 62 61 60 59  7  8
  9 10 54 53 52 51 15 16 
 48 47 19 20 21 22 42 41 
 40 39 27 28 29 30 34 33 
 32 31 35 36 37 38 26 25 
 24 23 43 44 45 46 18 17 
 49 50 14 13 12 11 55 56 
 57 58  6  5  4  3 63 64 
 

Here's my version of the program:

 import java.util.Scanner;
 public class MagicSquare {
 
   private static int[][] magicSquare;
 
   public static void main(String[] args) {
     Scanner input = new Scanner(System.in);
 
     boolean isAcceptableNumber = false;
     int size = -1;
 
     while (isAcceptableNumber == false)
     {
       System.out.println("Enter in size of square: ");
       String sizeText = input.nextLine();
       size = Integer.parseInt(sizeText);
       if ((size % 2 == 0) && (size % 4 !=0))
       {
         System.out.println("The size must be an odd number or an even number divisible by 4");
         isAcceptableNumber = false;
       }
       else
       {
         isAcceptableNumber = true;
       }
     }
 
     if (size % 4 == 0)
     {
       createDoublyEvenSquare(size);
     }
     else
     {
       createOddSquare(size);
     }
     displaySquare();
   }
 
   private static void createOddSquare(int size)
   {
     magicSquare = new int[size][size];
     int row = 0;
     int column = size/2;
     int lastRow = row;
     int lastColumn = column;
        
     magicSquare[row][column]= 1;
 
     int matrixSize = size*size; 
     for (int k=2;k < matrixSize+1;k++)
     {
       //check if we need to wrap to
       //opposite row
       if (row - 1 < 0)
       {
         row = size-1;
       }
       else
       {
         row--;
       }
       
       //check if we need to wrap
       //to opposite column
       if (column + 1 == size)
       {
         column = 0;
       }
       else
       {
         column++;
       }
       
       if (magicSquare[row][column] == 0)
       {
         magicSquare[row][column] = k;
       }
       else
       {
         row = lastRow;
         column = lastColumn;
         if (row + 1 == size)
         {
           row=0;
         }
         else
         {
           row++;
         }
         magicSquare[row][column] = k;
       }
       lastRow = row;
       lastColumn= column; 
     }
   }
 
   private static void createDoublyEvenSquare(int size)
   {
     magicSquare = new int[size][size];
     int countUpNumber = 1;
     StringBuilder usedNumbers = new StringBuilder();
     int miniSquareNumber = size/4;
 
     for (int j=0;j < magicSquare.length;j++)
     {
       //populate the corner mini-squares
       if ((j < miniSquareNumber) || (j > magicSquare.length-1-miniSquareNumber))
       {
         for (int k=0;k < miniSquareNumber;k++)
          {
           magicSquare[j][k] = countUpNumber;
           usedNumbers.append("/"+countUpNumber+"/");
           countUpNumber++;
         }
         countUpNumber = countUpNumber+(miniSquareNumber+miniSquareNumber);
         for (int k=magicSquare.length-miniSquareNumber;k < magicSquare.length;k++)
         {
           magicSquare[j][k] = countUpNumber;
           usedNumbers.append("/"+countUpNumber+"/");
           countUpNumber++;
         }
       }
       else //populate the large center square
       {
         countUpNumber = countUpNumber+miniSquareNumber;
         for (int k=miniSquareNumber;k < magicSquare.length-miniSquareNumber;k++)
         {
            magicSquare[j][k] = countUpNumber;
           usedNumbers.append("/"+countUpNumber+"/");
           countUpNumber++;
         }
         countUpNumber = countUpNumber+miniSquareNumber;
       }
     }
 
     int countDownNumber = size*size - miniSquareNumber;
     //populate remaining squares
     for (int l=0;l < magicSquare.length);l++)
     {
       for (int m=0;m < magicSquare[l].length);m++)
       {
         if (magicSquare[l][m] == 0)
         {
           while (usedNumbers.indexOf("/"+countDownNumber+"/") != -1)
           {
             countDownNumber--;
           }
           magicSquare[l][m] = countDownNumber; 
           countDownNumber--;
         }
       }
     }
   }
 
   private static void displaySquare()
   {
     int magicConstant = 0;
     for (int j=0;j < magicSquare.length;j++)
     {
       for (int k=0;k < magicSquare[j].length);k++)
       {
         System.out.print(magicSquare[j][k] + " ");
       }
       System.out.print("\n");
       magicConstant = magicConstant + magicSquare[j][0];
     }
     System.out.print("The magic constant is " + magicConstant);
   }
 } 

©2012 About.com. All rights reserved.

A part of The New York Times Company.