我正在尝试制作一个用于解决数独谜题的演绎算法。我的电路板由ArrayList中的81个节点组成。 - 每个节点都有一个布尔值 我希望我的算法(称为CRME)继续尝试解决难题,如果它发现至少有一个节点的布尔值(hasChanged)等于true,但我不确定如何做到这一点。 canChange也是此方法包含在类中的全局变量。
public void CRME() {
canChange = true;
while (canChange == true) {
for (Node node : cells) {
scanColumn(node);
scanRow(node);
scanMiniGrid(node);
}
}
}
public void scanRow(Node n){
for(Node node : cells){
int arraySize = node.posVals.size();
ArrayList<Integer> toRemove = new ArrayList<Integer>();
if(node.get_ROW_ID() == n.get_ROW_ID()){
toRemove.add(node.getValue());
}
n.posVals.removeAll(toRemove);
if(arraySize < node.posVals.size()){
node.hasChanged = true;
}
}
}
这是scanRow方法,其他两个类似命名的方法是相同的但是更改了明显的语法,例如node.get_ROW_ID();将是node.get_COL_ID();。
答案 0 :(得分:0)
我假设你有一个静态变量
static boolean hasChanged; // in the Node class
所以你可以使用:
node.hasChanged = true;
或者您可以创建hasChange方法来设置变量,如此
boolean hasChanged;
public void hasChanged(boolean val){
this.hasChanged = val;
}
并在循环中使用,如下所示:
hasChanged(true); or hasChanged(false);
答案 1 :(得分:0)
不是说您的方法最好,但如果您尝试在hasChanged
true
之一的任何节点上继续播放,则以下内容就足够了:
public void CRME()
{
goOn = false;
for (Node node : yourArrayListOfNodes)
{
if (node.hasChanged)
{
goOn = true;
break;
}
}
if (goOn)
{
//Insert Whatever code you want to run after the check
//.........................................
//Use recursion to repeat process
//Note recursive call will only take place if goOn is true
CRME()
}
}
这似乎就是你想做的事情,请注意,如果你的逻辑不正确,你可以得到一个StackOverflowError
,因为你会继续进行递归调用。