我不想要问,但我无法弄清楚这项任务,当我寻求帮助时TA也不能。
我必须从文本文件中获取输入,将文件中的整数提供给数组列表,然后测试它是否是n x n魔方。 n等于数组列表长度的平方根。如果它不是一个完美的正方形,它会立即通过魔法测试。
无论如何,我几乎已经完成了;我似乎并不理解我的教授在魔术测试的最后一步中告诉/要求我们做什么。
在最后四个步骤之前的所有测试都能完美无瑕地运行。我会在步骤之后发布我当前的代码。
让rowSums和colSums为两个长度为n的数组,条目全为零。另外,让sumDiagMajor和sumDiagMinor表示总和 从左上角到右下角和右上角的条目 左下角对角线分别为表格。
让index = 0
重复直到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
- 醇>
如果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语句永远不会运行。因此,它会排除一切测试作为一个魔术广场?
很抱歉这篇文章很长,但这很令人困惑。
答案 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循环中更改row
和col
这是一个错误。
为了便于理解,我建议在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.
}
}