我试图用Java编写非编程解算器用于学校作业。它适用于所有提供的输入,除了一个。我的代码在github上https://github.com/farkadav/Nonogram-solver
在CSPSolver中我解决了非图形。我根据github上的文本文件中的约束生成所有可能的行/列组合然后我检查弧一致性然后我试图通过回溯找到解决方案。我有输出它应该看起来也解决了。当我尝试解决dino.txt时,我的回溯功能似乎进入无限循环解决第11行和第15列。这是该方法的代码。
public void backtracking(){
if(orderedVars.isEmpty()){
String[] solString = new String[rowDim];
for(Line line : rowSolution){
solString[line.position] = new String();
for(int j=0; j<colDim; j++){
solString[line.position] +=line.value[j];
}
}
String solution = new String();
for(String sol : solString){
solution += sol +"\n";
}
solutions.add(solution);
return;
}
CSPVariable cspVar = orderedVars.poll();
for(char[] var : cspVar.storage){
if(consistent(var,cspVar)){
if(cspVar.Row){
rowSolution[helpX++] = new Line(var,cspVar.position,cspVar.Row);
backtracking();
rowSolution[--helpX] = null;
} else{
colSolution[helpY++] = new Line(var,cspVar.position,cspVar.Row);
backtracking();
colSolution[--helpY] = null;
}
}
}
orderedVars.add(cspVar);
}
我不知道究竟是什么导致它,任何帮助将不胜感激。如果有任何不清楚的地方,则链接到作业http://cw.fel.cvut.cz/wiki/courses/a4b33zui/task2-malovane-krizovky-en
答案 0 :(得分:0)
在操作helpX和helpY之间调用backtracking()对我来说是个问题。如果从算法的定义中没有必要尝试以这种方式重新排序,则在调用backtracking()之前修改helpX和helpY。