测试Magic Square Java的.txt文件

时间:2015-11-10 07:46:05

标签: java algorithm arraylist magic-square

我不想要问,但我无法弄清楚这项任务,当我寻求帮助时TA也不能。

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

无论如何,我几乎已经完成了;我似乎并不理解我的教授在魔术测试的最后一步中告诉/要求我们做什么。

在最后四个步骤之前的所有测试都能完美无瑕地运行。我会在步骤之后发布我当前的代码。

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

  2.   
  3. 让index = 0

  4.   
  5. 重复直到index = n2(a)通过ArrayList {index}递增rowSums [row](b)通过ArrayList {index}递增colSums [col](c)   如果row = col,则通过ArrayList {index}递增sumDiagMajor。 (d)如果   row + col = n-1,然后通过ArrayList {index}增加sumDiagMinor(e)   增量指数为1

  6.   
  7. 如果sumDiagMajor等于sumDiagMinor以及rowSums和colSums的每个条目,则表格为魔方;否则,它不是。

  8.   
   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语句永远不会运行。因此,它会排除一切测试作为一个魔术广场?

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

2 个答案:

答案 0 :(得分: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
}

答案 1 :(得分:0)

您永远不会在for循环中更改rowcol这是一个错误。 为了便于理解,我建议在rowIndex和colIndex上使用两个嵌套的for循环,并使用一个小帮助器从1-D数组中获取值,如下所示:

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

假设1-D阵列是&#34;扁平&#34;构建的方形如(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.
    }
}