我正在为Java中的Peg纸牌游戏开发一个解决方案。然而,我的解决方案似乎无法解决游戏。
我正在使用“标准”版本,所以董事会看起来像:
{2, 2, 1, 1, 1, 2, 2}
{2, 2, 1, 1, 1, 2, 2}
{1, 1, 1, 1, 1, 1, 1}
{1, 1, 1, 0, 1, 1, 1}
{1, 1, 1, 1, 1, 1, 1}
{2, 2, 1, 1, 1, 2, 2}
{2, 2, 1, 1, 1, 2, 2}
0为空,1为钉,2为空
所需的电路板状态为
{2, 2, 0, 0, 0, 2, 2}
{2, 2, 0, 0, 0, 2, 2}
{0, 0, 0, 0, 0, 0, 0}
{0, 0, 0, 1, 0, 0, 0}
{0, 0, 0, 0, 0, 0, 0}
{2, 2, 0, 0, 0, 2, 2}
{2, 2, 0, 0, 0, 2, 2}
我的Solutions()方法是这样工作的:
方向(向上、向下、向左或向右)移动位置x、y
上的销钉
- 检查电路板是否处于所需状态,如果处于所需状态,请打印电路板并移动,然后退出程序
- 检查是否还有可以移动的挂钩,如果没有,退出功能
- 找到第一个可能在一个或多个方向上移动的销钉;调用solve()来计算这个peg,它就是方向
- (如果我们到了这里,第4步产生了一个不希望出现的电路板状态)撤销第4步中的操作,并使用peg可能做出的下一个操作(如果有的话)回忆第4步
- 返回到步骤4,查看在步骤4中找到的栓之后的下一个可能的栓
我已经像这样执行了上述指令:
private void play(int xx, int yy, Direction direction) {
board.move(xx, yy, direction);
if (board.finished()) {
board.printBoard();
System.out.println(moves);
System.exit(0);
}
if (board.noMoreMoves()) {
return;
}
for (int y = 0; y < board.board.length; y++) {
for (int x = 0; x < board.board[y].length; x++) {
if (board.containsPeg(x, y)) {
Direction[] moves = board.getMovesFor(x, y);
for (Direction move : moves) {
if (move != null) {
this.moves++;
play(x, y, move);
if (move.equals(Direction.UP)) {
board.undoMove(x, y-2, move);
} else if (move.equals(Direction.DOWN)) {
board.undoMove(x, y+2, move);
} else if (move.equals(Direction.LEFT)) {
board.undoMove(x-2, y, move);
} else if (move.equals(Direction.RIGHT)) {
board.undoMove(x+2, y, move);
}
}
}
}
}
}
return;
}
然而,上述解决方案不会产生所需的电路板状态。这个版本在eclipse中运行了一个多小时,没有任何结果。
我已经测试了方法板。移动(x,y,方向),板。已完成(),电路板。noMoreMoves(),板。集装箱箱(x,y),板。获取(x,y)和板的移动。分开移动(x、y、方向),它们似乎都能按预期运行。
在我的实现中,或者在递归/回溯中,我是否缺少一些东西?我很确定解决方案不需要超过2亿次移动。
你需要的是一个调试策略。
使用一种可以输出电路板状态的方法。另外,写一个可以保存你的电路板的表示,还有一个可以比较两个状态,看看它们是否相同。
第一种方法失败后输出,然后在回溯后的不同点确保回溯已回溯到正确的轨迹。
还要确保你不会多次跟踪同一个动作。
至于可能的移动次数,不要太确定。人们不会认为,在国际象棋的前10-20步中,有几十亿种可能的棋步,但确实有。
我目前正在尝试编写一个程序,将能够找到解决方案的游戏佩格纸牌使用回溯。 我的程序接收一个包含启动板的txt文件。除了solve()函数包含实际的回溯部分之外,所有的事情都完成了,这在概念上对我来说非常困难。我已经在一张纸上写了一段时间,但我认为我没有取得多大进展。任何帮助都将不胜感激。下面的示例txt文件,=peg,
谁能帮帮我吗?
我正在用java制作一个带回溯功能的peg纸牌解析器。 我就是这么做的: 问题是我找不到解决办法。以下是代码的输出:http://pastebin.com/raw.php?i=BhkLu3qr.如您所见,解决方案阵列不完整。 谢谢
我正在做一个小的个人数独游戏,并试图扩展它。 到目前为止,我使用递归回溯方法使“Solve”部分正常工作,每当它设法解决递归时,就会返回true。 现在我正在尝试构建一个独特的解决方案板生成器,我在网上找到了很多关于如何实现它的信息。 然而,我在第一步很挣扎,这是我的布尔递归回溯算法变成一个递归算法,它保留了一个可能解决方案的计数。这对于检查我生成的板是否是唯一的至关重要。 更重要的是,我意识到我
我有下面的课。我试图使getConfig()返回指定的类型,然而,它只作为BaseConfig返回。假设我有扩展BaseConfig的MyConfig,我希望该方法返回MyConfig而不是BaseConfig。我真的很感激任何帮助,因为我似乎找不到合适的解决方案,为我工作。 一些其他类组成了我正在研究的系统: 另一个: