java - 求解单偶幻方 (Lux)

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

}

如有任何帮助,我们将不胜感激!

最佳答案

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
}

关于java - 求解单偶幻方 (Lux),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5573842/

相关文章:

java - 在 netbeans 中创建具有多个主类的 jar

c - C 语言螺旋魔方

algorithm - 改进的 BFS 时间复杂度

algorithm - 如何计算 B+ 树的查找时间复杂度为 O(log(n))

java - 以更简单的方式编写代码

java - 在 KafkaBolt 中暴露 Kafka 发布异常

java - 使用增强的for循环java迭代多维数组

java - 如果一个类是用泛型类型参数声明的,并且它在没有指定类型的情况下被实例化,它是否默认为 Object?

algorithm - 摊销分析和竞赛题,有什么问题吗?