在java中创建一个魔术广场

时间:2016-03-16 15:35:56

标签: java arrays while-loop magic-square

我必须编写一个程序,从用户那里获取一个奇数并创建一个魔术方块。魔术方格是每个行,列和对角线的总和相同的方格。这些是编写代码的特征:

  
      
  1. 向用户询问奇数
  2.   
  3. 创建一个n×n数组。
  4.   
  5. 按照以下步骤创建一个魔方   一个。在第一行的中间放置一个   湾从行中减去1并添加1   到专栏      一世。如果可能的话,将下一个号码放在该位置   II。如果不可能,请按照下列步骤操作。      
        
    1. 如果在第-1行,则更改为最后一行
    2.   
    3. 如果在最后一列中更改为第一列
    4.   
    5. 如果被阻止,则下拉到下一行(从原始位置)
    6.   
    7. 如果在右上角,则下拉到下一行。
    8.   
  6.   
  7. 打印阵列
  8.   

我已经编写了代码,但是当我运行代码时,程序会输入除了数字2之外的所有数字;由于某种原因,我的程序跳过了它。例如,如果我输入数字3作为奇数,我的输出是:

6 1 0 
3 4 5 
9 7 8 

0不应该在那里,但第二个是。这是我的代码:

public static void main(String[] args) {
    System.out.print("Give an odd number: ");
    int n = console.nextInt();
    int[][] magicSquare = new int[n][n];

    int number = 1;
    int row = 0;
    int column = n / 2;
    while (number <= n * n) {
        magicSquare[row][column] = number;
        number++;
        row -= 1;
        column += 1;
        if (row == -1) {
            row = n - 1;
        }
        if (column == n) {
            column = 0;
        }
        if (row == 0 && column == n - 1) {
            column = n - 1;
            row += 1;
        } else if (magicSquare[row][column] != 0) {
            row += 1;
        }
    }

    for (int i = 0; i < magicSquare.length; i++) {
        for (int j = 0; j < magicSquare.length; j++) {
            System.out.print(magicSquare[i][j] + " ");
        }
        System.out.println();
    }
}

有人能告诉我哪里出错了,为什么我的程序会跳过2号? *这是一个家庭作业问题,所以代码只能回答。感谢。

2 个答案:

答案 0 :(得分:6)

你的方块的逻辑确保永远不会写入右上角。

if in the upper right corner, then drop down to next row.

这是执行它的代码......

if (row == 0 && column == n - 1) {
    column = n -1;
    row += 1;

因此,在下次迭代中输入任何值之前,您总是会离开该位置。实际上你并不需要那条将列设置为n - 1的行,因为根据它上面的逻辑定义,它已经是n - 1。

您实际上是将值2写入第二行第三列。然后它会被值5覆盖。如果在程序的每次迭代后输出数组的值,那么您将看到模型的状态是如何变化的。

答案 1 :(得分:3)

删除3.4可能会修复您的代码。

public static void main(String[] args) {

    System.out.print("Give an odd number: ");
    int n = console.nextInt();
    int[][] magicSquare = new int[n][n];

    int number = 1;
    int row = 0;
    int column = n / 2;
    int curr_row;
    int curr_col;
    while (number <= n * n) {
        magicSquare[row][column] = number;
        number++;
        curr_row = row;
        curr_col = column;
        row -= 1;
        column += 1;
        if (row == -1) {
            row = n - 1;
        }
        if (column == n) {
            column = 0;
        }
        if (magicSquare[row][column] != 0) {
            row = curr_row + 1;
            column = curr_col;
            if (row == -1) {
                row = n - 1;
            }
        }
    }

    for (int i = 0; i < magicSquare.length; i++) {
        for (int j = 0; j < magicSquare.length; j++) {
            System.out.print(magicSquare[i][j] + " ");
        }
        System.out.println();
    }
}

设置n = 3会得到以下输出,看起来是正确的。

8 1 6 
3 5 7 
4 9 2