解决单一甚至魔术广场(勒克斯)

时间:2011-04-06 22:42:44

标签: java algorithm magic-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 

魔法常数为375

Conway's LUX method for magic squares

任何人都可以帮我解决问题或告诉我错误或问题所在吗?

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

}

感谢任何帮助谢谢!

1 个答案:

答案 0 :(得分:2)

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
}