【问题标题】:Creating a Magic Square in java在java中创建一个魔方
【发布时间】:2016-07-02 14:31:37
【问题描述】:

我必须编写一个程序,从用户那里接收一个奇数并创建一个魔方。幻方是其中每一行、每一列和对角线之和相同的方。这些是编写代码的特点:

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

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

6 1 0 
3 4 5 
9 7 8 

0 不应该在那里,但数字 2 是。这是我的代码:

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? *这是一个家庭作业问题,所以请只回答代码。谢谢。

【问题讨论】:

  • 您的变量控制台未定义。
  • @Chris311 这可能是他班级的一个领域,因为他的代码似乎正在编译。
  • @Chris311 它在程序中,我只是没有在这里包含它。
  • 由于 number 从 1 开始,并且从不递减,因此数组中可能包含 0 的唯一原因是,从不填充相应的索引。
  • 这正是这里发生的事情,因为需求的逻辑,或者至少是代表它的代码,阻止了它。 2 被写入第 2 行第 3 列,但后来被 5 覆盖。

标签: java arrays while-loop magic-square


【解决方案1】:

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

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 覆盖。如果您在程序的每次迭代后输出数组的值,那么您将看到模型的状态是如何变化的。

【讨论】:

    【解决方案2】:

    删除 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 
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-07-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多