如何仅通过这种回溯找到第一个解决方案
我正在尝试编写一个数独求解器,它将仅返回第一个可能的解决方案。 我设法用 void 方法打印所有可能的解决方案,但我不能在第一个发现时停止。
我知道首选方法是切换到布尔方法并在树上返回 true
- 但我找不到正确的写法。
我尝试的任何方法总是给出编译错误(方法必须返回布尔值
)。
public boolean recursiveSolve(int line, int column) {
if(line == N) // N is the board size (9)
return true;
// if Cell is not empty - continue
if(board1.getCell(line, column) != 0) {
return nextCell(line, column);
}
// if Cell empty - solve
else {
for(int i = 1; i <= N; i++) {
board1.setCell(line, column, i); // set value to cell
if(board1.boardIsOk()) // check if the board is legal
return nextCell(line, column); // continue
}
board1.setCell(line, column, 0); // backtrack
}
}
private boolean nextCell(int line, int column) {
if(column < 8)
return recursiveSolve(line, column+1); // progress up the row
else
return recursiveSolve(line+1, 0); // progress down the lines
}
任何帮助将不胜感激。
i'm trying to write a Sudoku solver which will return only the first possible solution.
i managed to print all possible solutions with void methods but i can't stop on the first find.
i know the preferred way is to switch to boolean methods and return true
up the tree -
but i can't find the right way to write it.
any way i tried always give compilation errors (method must return boolean
).
public boolean recursiveSolve(int line, int column) {
if(line == N) // N is the board size (9)
return true;
// if Cell is not empty - continue
if(board1.getCell(line, column) != 0) {
return nextCell(line, column);
}
// if Cell empty - solve
else {
for(int i = 1; i <= N; i++) {
board1.setCell(line, column, i); // set value to cell
if(board1.boardIsOk()) // check if the board is legal
return nextCell(line, column); // continue
}
board1.setCell(line, column, 0); // backtrack
}
}
private boolean nextCell(int line, int column) {
if(column < 8)
return recursiveSolve(line, column+1); // progress up the row
else
return recursiveSolve(line+1, 0); // progress down the lines
}
Any help will be most appreciated.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
这是大多数递归回溯问题的一些伪代码。
这是一些基于斯坦福大学讲座的实际代码。我用java重新编写了它并添加了注释。
您只需要实现一些非常简单的方法。
Here is some pseudocode for most recursive backtracking problems.
Here is some actual code based on a lecture from Stanford. I re-wrote it in java and included comments.
You just need to implement a few methods, which are pretty trivial.
变成
Change
into