我正在用java制作一个带回溯功能的peg纸牌解析器。
我就是这么做的:
private void solve(Board board, ArrayList<Movement> solution, Boolean result) {
ArrayList<Movement> movs = board.getMovements();
for (Movement movement : movs) {
if (board.isMovementValid(movement)) {
board.doMovement(movement);
if(!board.isSolution()) {
solution.add(movement);
solve(board, solution, result);
result.setValue(false);
} else {
result.setValue(true);
}
}
}
result.setValue(false);
}
问题是我找不到解决办法。以下是代码的输出:http://pastebin.com/raw.php?i=BhkLu3qr.如您所见,解决方案阵列不完整。
谢谢
假设你的board.get运动()
方法给你一个列表,列出了游戏中从这一点开始的所有可能的移动,你就快到了。你只需要在赢的时候停下来。为了清楚起见,我已经重构了一点。
private boolean solve(Board board, ArrayList<Movement> solution) {
// The base case: if it's already solved, we're done
if (board.isSolution())
return true;
// Get all possible moves from this point
ArrayList<Movement> movs = board.getMovements();
for (Movement movement : movs) {
if (board.isMovementValid(movement)) {
board.doMovement(movement);
solution.add(movement);
if (solve(board, solution))
// That move led to success :-)
return true;
else
// That move led to failure :-(
solution.remove(movement);
}
}
return false;
}
虽然不那么优雅,但为了回溯并重试替代方案,必须返回以下步骤:
ArrayList<Movement> movs = board.getMovements();
for (Movement movement : movs) {
if (board.isMovementValid(movement)) {
board.doMovement(movement);
solution.add(movement);
if(!board.isSolution()) {
solve(board, solution, result);
// Initialized to result.setValue(false);
if (result.getValue()) { return; }
} else {
result.setValue(true);
return;
}
solution.remove(movement);
board.undoMovement(movement);
}
}
result.setValue(false);
此外,对于更一般的解决方案,如果您对第一个解决方案感到满意,我还添加了回报。
我正在为Java中的Peg纸牌游戏开发一个解决方案。然而,我的解决方案似乎无法解决游戏。 我正在使用“标准”版本,所以董事会看起来像: 0为空,1为钉,2为空 所需的电路板状态为 我的Solutions()方法是这样工作的: 沿
我目前正在尝试编写一个程序,将能够找到解决方案的游戏佩格纸牌使用回溯。 我的程序接收一个包含启动板的txt文件。除了solve()函数包含实际的回溯部分之外,所有的事情都完成了,这在概念上对我来说非常困难。我已经在一张纸上写了一段时间,但我认为我没有取得多大进展。任何帮助都将不胜感激。下面的示例txt文件,=peg,
hasNext()的定义是“如果此扫描仪的输入中有另一个标记,则返回true。此方法可能会在等待输入扫描时阻塞。扫描仪不会前进超过任何输入。” 当我把 standardInput.hasNext() 放在 for 循环中时,程序会向无穷大运行。但是如果我把它放在 while-loop 中,它不会运行到无穷大。这两个程序之间的区别在哪里,为什么其中一个有效而另一个无效? for循环: while-l
我有一个带感应帽的覆盆子皮。我制作了一个二进制时钟,我想在Sense hat的显示器上显示并保持更新。然而,我想要的能力,开关时钟与操纵杆中间。一切都很好,除了我的时钟的更新循环阻止任何新的输入一旦启动。 我一直在考虑如何解决这个问题。如何允许脚本/时钟保持运行,并且仍然接受来自操纵杆的新操作。但是一旦while循环开始,我就卡住了。我不知道该用谷歌搜索什么。我已经开始研究async/await,
我正在用我的java书复习数据结构,我需要重新创建一个循环链表。我对这个无限循环的链表有问题,弄不清楚为什么。我可以将值插入到列表中,但是打印和删除这些值似乎会无限循环最初插入的值。我如何更改我的List类以避免无限循环? CircularList.Class 链接类
问题内容: 为什么我在递归方法中遇到无限循环,而没有机会输入任何符号来破坏它? 如果您尝试创建错误(将字符串值输入键,然后尝试向其添加数字),则您将在控制台中获得无限的“错误”文本,而不是在第一次错误后,程序应再次询问该数字和然后才决定要做什么。 问题答案: 如果失败,则抛出异常,但不使用无效数据。从文档中: 当扫描程序抛出时,扫描程序将不会传递导致异常的令牌,因此可以通过其他方法检索或跳过该令牌