【发布时间】:2016-02-11 00:56:33
【问题描述】:
我不想问,但我想不通这个任务,当我寻求帮助时,TA也想不通。
我必须从文本文件中获取输入,将文件中的整数输入到数组列表中,然后测试它是否是一个 n x n 幻方。 n 等于数组列表长度的平方根。如果它不是一个完美的正方形,它会立即通过幻方测试。
反正我已经差不多完成了;我只是似乎不明白我的教授在魔方测试的最后一步告诉/要求我们做什么。
最后四个步骤之前的所有测试都完美无缺。我会在这些步骤之后发布我当前的代码。
令 rowSums 和 colSums 是两个长度为 n 且条目全为零的数组。另外,设 sumDiagMajor 和 sumDiagMinor,代表总和 从左上角到右下角和右上角到 分别是表格的左下角对角线。
设索引 = 0
重复直到 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
如果 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) && sumDiagMajor == sumDiagMinor -
@vish4071 你说得对,我刚看到这个。没有深入研究他的代码。我建议创建一个辅助方法
getValue(int row, int col),将二维坐标转换为一维索引并返回相应的值,而不是直接使用索引。
标签: java algorithm arraylist magic-square