测试Magic Square Java的.txt文件

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

我必须从文本文件中获取输入,将文件中的整数提供给数组列表,并测试它是否是焦虑魔方。 n等于数组列表长度的平方根。 如果它不是一个完美的方形,它立即失败了魔方测试。

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

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

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

  2. 设index = 0

  3. 重复直到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

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

很抱歉很长的post,但这很令人困惑。

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

 public static void main(String[] args) { List 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 } 

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

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

假设1-D数组是一个“扁平”的方形,它构建成(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. } }