我正在为我们进行填充网格的项目尝试此代码,并通过我们可以在代码中交换的三个URL来评估给定数独网格的方法。我现在对效率不感兴趣,因为我仍然试图掌握Java。到目前为止,这是我对evaluate方法的代码
我理解前两个用于框的循环背后的逻辑,但我试图理解后两个
编辑:我问我为盒子检查器编写的内容是否正确,因为即使写入的网格都是正确的数据板,它仍然会返回falsepublic boolean evaluate() {
// check row
for (int i = 0; i < 9; i++) {
for (int j = 0; j < 9; j++) {
for (int k = j + 1; k < 9; k++) {
if (gridButton[i][j].getText().equals(gridButton[i][k].getText())) return false;
}
}
}
// check box
for (int i = 0; i < 9; i += 3) {
for (int j = 0; j < 9; j += 3) {
for (int k = 0; k < 3; k++) {
for (int l = 0; l < 3; l++) {
if (gridButton[i][j].getText().equals(gridButton[k][l].getText())) return false;
k += 1;
}
}
}
}
// check col
for (int i = 0; i < 9; i++) {
for (int j = 0; j < 9; j++) {
for (int k = i + 1; k < 9; k++) {
if (gridButton[i][j].getText().equals(gridButton[k][j].getText())) return false;
}
}
}
return false;
}
我和我的教授合作开了一个可行的行检查器,我自己也用它来检查col检查器,但我还不完全确定如何编写盒子检查器。
答案 0 :(得分:0)
代码中的Box算法执行9x9x3x3 == 729比较。
或许更好的方法是在每个行,列或框中使用HashSet。一旦在集合中找到重复值,它就可以纾困。
使用Set,可以进行9x3x3 == 81
查找和插入。假设Set插入和查找都是 O(1)
// check box
HashSet<String> set = new HashSet<String>();
for (int i = 0; i < 9; i++) { // for each major 3x3 box
set.clear(); // start with an empty "set"
// examine each cell in the box. If the cell's value is already in
// "set", then we have a duplicate and should exit. Otherwise, add
// the cell's value to the set
for (int r = 0; r < 3; r++) {
for (int c = 0; c < 3; c++) {
int row = (i / 3) + r;
int column = 3*(i%3) + c;
String val = gridButton[row][column].getText();
if (set.contains(val) {
return false; // the value of the cell was already found, bail
}
set.add(val); // not found, add it to the set
}
}
}
您可以将相同的技术应用于&#34;检查行&#34;和&#34;检查栏&#34;算法并没有比较少的比较。这是一项我将留给你解决的练习。
如果我们比较整数而不是文本字符串,我们可以使用简单的布尔数组而不是HashSet实例。 :)