2

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

我必须从文本文件中获取输入,将文件中的整数输入到数组列表中,然后测试它是否是 anxn 幻方。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) 将 index 增加 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 语句将永远不会运行。因此它将排除所有测试为幻方?

对不起,很长的帖子,但这很令人困惑。

4

2 回答 2

3

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

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
}
于 2015-11-10T08:15:44.243 回答
0

你永远不会改变row并且col在你的 for 循环中这是一个错误。为了更容易理解,我建议在 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.
    }
}
于 2015-11-10T08:06:08.210 回答