ferronrsmith
ferronrsmith

Reputation: 1110

Solving Singly Even Magic Square (Lux)

Hey guys I am trying to implement a method for solving singly even magic square, but it seems to generating the wrong results.

Result generated by the following code

Enter in size of square: 10

75 75  0  0  0 50 50 50 50 25 
75 75  0  0  0 50 50 50 50 25 
 0 75 75  0  0 50 50 50 50 25 
75 75  0  0  0 50 50 50 50 25 
75 75  0  0  0 50 50 50 50 25 
 0  0 75 75 75 25 25 25 25 50 
 0  0 75 75 75 25 25 25 25 50 
75  0  0 75 75 25 25 25 25 50 
 0  0 75 75 75 25 25 25 25 50 
 0  0 75 75 75 25 25 25 25 50 

The magic constant is 375

Conway's LUX method for magic squares

Can anyone help me fix it or inform me on what is wrong or where my problems lie?

import java.util.Scanner;

public class MagicSquare {

private static int[][] magicSquare; //initialization

public static void main(String[] args) {
    Scanner input = new Scanner(System.in);

    int size = -1;

    System.out.println("Enter in size of square: ");
    size = input.nextInt();

    magicSquare = new int [size][size];

    singlyEvenMagicSquare(size);
    displaySquare();
}

public static void singlyEvenMagicSquare(int size)
{
  int i, j, k, index=0;

  int p=size/2;

  int [][] M =  new int [p][p];
  //magicSquare = new int[size][size];

  for (i=0; i<p; i++)
    for (j=0; j<p; j++)
    {
      magicSquare[i][j]=M[i][j];
      magicSquare[i+p][j]=M[i][j]+3*p*p;
      magicSquare[i][j+p]=M[i][j]+2*p*p;
      magicSquare[i+p][j+p]=M[i][j]+p*p;
    }

  if (size==2)
    return;  

  int [] I = new int[p];
  int [] J = new int[size];

  for (i=0; i<p; i++)
    I[i]=i+1;

  k=(size-2)/4;

  for (i=1; i<=k; i++)
    J[index++] = i;

  for (i=size-k+2; i<=size; i++)
    J[index++] = i;

  int temp;
  for (i=1; i<=p; i++)
    for (j=1; j<=index; j++)
    {
      temp=magicSquare[i-1][J[j-1]-1];
      magicSquare[i-1][J[j-1]-1]=magicSquare[i+p-1][J[j-1]-1];
      magicSquare[i+p-1][J[j-1]-1]=temp;
    }

  //j=1, i
  //i=k+1, k+1+p
  i=k; 
  j=0;
  temp=magicSquare[i][j]; 
  magicSquare[i][j]=magicSquare[i+p][j]; 
  magicSquare[i+p][j]=temp;

  j=i;
  temp=magicSquare[i+p][j]; 
  magicSquare[i+p][j]=magicSquare[i][j]; 
  magicSquare[i][j]=temp;


}

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);
}

}

Any help would be appreciated thanks!

Upvotes: 1

Views: 2881

Answers (1)

ferronrsmith
ferronrsmith

Reputation: 1110

public class MagicSquare {

    private static int[][] magicSquare;
    private static int size; 

    public static void main(String[] args) {

        size = readValueFromFile();

        boolean validNum = false;

            if (size<3) {
                System.err.println("Enter a positive integer square size of 3 or more");
                validNum = false;
            } else {
                validNum = true;
            }

        if(validNum){
            magicSquare = new int [size][size];
            MagicSq(magicSquare,size);
            displaySquare();

        }
    }

    /**
     * The following function determines which magic square operation to perform given the order(n)
     * @param magicSquare
     * @param size
     */
    public static void MagicSq(int[][] magicSquare,int size) {
        if(size%2==1)
            OddMagicSquare(magicSquare,size);
        else if (size%4==0)
            DoubleEvenMagicSquare(magicSquare,size);
        else
            SinglyEvenMagicSquare(magicSquare,size);

    }

    public static void SinglyEvenMagicSquare(int[][] magicSquare,int size) {
      int i, j, k, index=0;

      int p=size/2;

      int [][] M =  new int [p][p];

      MagicSq(M,p);

      System.out.println();

      for (i=0; i<p; i++)
        for (j=0; j<p; j++) {
          magicSquare[i][j]=M[i][j];
          magicSquare[i+p][j]=M[i][j]+3*p*p;
          magicSquare[i][j+p]=M[i][j]+2*p*p;
          magicSquare[i+p][j+p]=M[i][j]+p*p;
        }

      if (size==2)
        return;  

      int [] I = new int[p];
      int [] J = new int[size];

      for (i=0; i<p; i++)
        I[i]=i+1;

      k=(size-2)/4;

      for (i=1; i<=k; i++)
        J[index++] = i;

      for (i=size-k+2; i<=size; i++)
        J[index++] = i;

      int temp;
      for (i=1; i<=p; i++)
        for (j=1; j<=index; j++){
          temp=magicSquare[i-1][J[j-1]-1];
          magicSquare[i-1][J[j-1]-1]=magicSquare[i+p-1][J[j-1]-1];
          magicSquare[i+p-1][J[j-1]-1]=temp;
        }

      i=k; 
      j=0;
      temp=magicSquare[i][j]; 
      magicSquare[i][j]=magicSquare[i+p][j]; 
      magicSquare[i+p][j]=temp;

      j=i;
      temp=magicSquare[i+p][j]; 
      magicSquare[i+p][j]=magicSquare[i][j]; 
      magicSquare[i][j]=temp;
    }

   //truncated for clarity
}

Upvotes: 2

Related Questions