Java数独求解器方法

时间:2018-03-11 01:50:10

标签: java

我正在为我们进行填充网格的项目尝试此代码,并通过我们可以在代码中交换的三个URL来评估给定数独网格的方法。我现在对效率不感兴趣,因为我仍然试图掌握Java。到目前为止,这是我对evaluate方法的代码

我理解前两个用于框的循环背后的逻辑,但我试图理解后两个

编辑:我问我为盒子检查器编写的内容是否正确,因为即使写入的网格都是正确的数据板,它仍然会返回false

public 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检查器,但我还不完全确定如何编写盒子检查器。

1 个答案:

答案 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实例。 :)