【问题标题】:Testing a .txt file for a Magic Square Java测试 Magic Square Java 的 .txt 文件
【发布时间】:2016-02-11 00:56:33
【问题描述】:

我不想问,但我想不通这个任务,当我寻求帮助时,TA也想不通。

我必须从文本文件中获取输入,将文件中的整数输入到数组列表中,然后测试它是否是一个 n x n 幻方。 n 等于数组列表长度的平方根。如果它不是一个完美的正方形,它会立即通过幻方测试。

反正我已经差不多完成了;我只是似乎不明白我的教授在魔方测试的最后一步告诉/要求我们做什么。

最后四个步骤之前的所有测试都完美无缺。我会在这些步骤之后发布我当前的代码。

  1. 令 rowSums 和 colSums 是两个长度为 n 且条目全为零的数组。另外,设 sumDiagMajor 和 sumDiagMinor,代表总和 从左上角到右下角和右上角到 分别是表格的左下角对角线。

  2. 设索引 = 0

  3. 重复直到 index = n2 (a) 将 rowSums[row] 增加 ArrayList{index} (b) colSums[col] 增加 ArrayList{index} (c) 如果 row = col,则将 sumDiagMajor 增加 ArrayList{index}。 (d) 如果 row + col = n−1,然后将 sumDiagMinor 增加 ArrayList{index} (e) 将索引增加 1

  4. 如果 sumDiagMajor 等于 sumDiagMinor 以及 rowSums 和 colSums 的每个条目,则该表是一个幻方;否则不是。

   int rowSums[] = new int[_n];
   int colSums[] = new int[_n];
   int sumDiagMajor = 0;
   int sumDiagMinor = 0;

   int row, col;
   row = col = 0;

   for (int index = 0; index < (n*n); index++)
   {          
       rowSums[row] = rowSums[row] + magicSquare.get(index);
       colSums[col] = colSums[col] + magicSquare.get(index);

       if (row == col)
       {       
           sumDiagMajor = sumDiagMajor + magicSquare.get(index);   
       }

       if ((row + col) == (n - 1))
       {
           sumDiagMinor = sumDiagMinor + magicSquare.get(index);   
       }

   }

   System.out.println(sumDiagMajor);
   System.out.println(sumDiagMinor);

我的问题包括,我是否正确地增加了数组 rowSums 和 rowCols?他从未真正说明如何处理行或列,所以将它们初始化为零是最佳选择吗?

如果到目前为止我所做的一切都是正确的,那么 sumDiagMajor 怎么可能等于 sumDiagMinor 因为行总是等于 cols,所以第二个嵌套的 if 语句将永远不会运行。因此它将排除所有测试为幻方?

很抱歉,这篇文章很长,但这很令人困惑。

【问题讨论】:

  • 您的 magicsquare[] 是一个大小为 n * n 的一维数组。我建议创建一个大小为 n * n 的二维数组(矩阵)。然后,问题是不言自明的。
  • 我认为您误解了作业的一部分。 “行将永远等于列”......这意味着索引。当您迭代 colIndex 和 rowIndex 时,它将是 (0,0), (0,1), ... (1,0), (2,0) ... 所以如果 row = col 表示 (0,0) , (1,1), ... 然后您应将 sumDiagMajor 增加 Matrix 中相应坐标处的值。 sumDiagMinor 的模拟量。在您的 for 循环中,您永远不会更改行和列。这是一个错误!
  • @Fildor,是的。这是因为他将magicsquare[] 作为一维数组。所以,实际上没有行/列,它只是索引。
  • 步骤 7) boolean isMagicSquare = Arrays.equals(rowSums, colSums) &amp;&amp; sumDiagMajor == sumDiagMinor
  • @vish4071 你说得对,我刚看到这个。没有深入研究他的代码。我建议创建一个辅助方法getValue(int row, int col),将二维坐标转换为一维索引并返回相应的值,而不是直接使用索引。

标签: java algorithm arraylist magic-square


【解决方案1】:

根据您的更新要求。一个完整的例子。

public static void main(String[] args) {
    List<Integer> magicSquare = Arrays.asList(2,7,6,9,5,1,4,3,8);

    int n = (int) Math.sqrt(magicSquare.size());
    int rowSums[] = new int[n];
    int colSums[] = new int[n];
    int sumDiagMajor = 0;
    int sumDiagMinor = 0;

    int row = -1;
    int col = -1;

    for (int index = 0; index < n*n; index++) {

        col++;
        if (col % n == 0) {
            row++;
            col = 0;
        }

        rowSums[row] = rowSums[row] + magicSquare.get(index);
        colSums[col] = colSums[col] + magicSquare.get(index);


        if (row == col)
        {
            sumDiagMajor += magicSquare.get(index);
        }

        if ((row + col) == (n - 1))
        {
            sumDiagMinor += magicSquare.get(index);
        }

    }

    boolean isMagicSquare = true;
    for (int i = 0; i < n && isMagicSquare; i++) {
        isMagicSquare = sumDiagMajor == rowSums[i] && sumDiagMajor == colSums[i];
    }
    isMagicSquare = isMagicSquare && sumDiagMajor == sumDiagMinor;

    System.out.println(isMagicSquare); // true
}

【讨论】:

  • 这看起来很有希望。我现在很想实现它,但是我的笔记本电脑电池没电了,所以我正在使用我的工作电脑。我会尽快收取费用,并希望能够将此答案标记为正确。谢谢!
  • @SamBowden - 欢迎!我更新了最后一步以确保所有值都匹配。
  • 等不及了,所以我在我的工作电脑上安装了 netbeans 并运行了它,还玩了这个数组,看看其他场景是否返回 false。感谢您帮助我理解这一点。
  • @SamBowden - 嗯,你有它的要点。我需要查找什么是幻方 :) 在处理一堆扁平矩阵之后,递增行和列的 sn-p 成为第二天性
【解决方案2】:

你永远不会在你的 for 循环中更改 rowcol,这是一个错误。 为了更容易理解,我建议在 rowIndex 和 colIndex 上使用两个嵌套的 for 循环,并使用一个小助手从一维数组中获取值,如下所示:

int getValue(int row, int col){
    return magicSquare.get( row * _n + col );
}

假设一维数组是一个像 (0,0), (0,1), ... (0,_n), (1, 0) , ... (_n,_n)

为了更清楚:迭代正方形而不是使用索引:

for( int row = 0 ; row < _n ; row++){
    for( int col = 0 ; col < _n ; col++){
       // Your stuff here.
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-11-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-13
    • 2015-10-26
    • 1970-01-01
    相关资源
    最近更新 更多