当前位置: 首页 > 知识库问答 >
问题:

Peg接龙找不到回溯的解决方案

拓拔俊德
2023-03-14

我正在为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()方法是这样工作的:

  1. 沿方向(向上、向下、向左或向右)移动位置x、y上的销钉
  2. 检查电路板是否处于所需状态,如果处于所需状态,请打印电路板并移动,然后退出程序
  3. 检查是否还有可以移动的挂钩,如果没有,退出功能
  4. 找到第一个可能在一个或多个方向上移动的销钉;调用solve()来计算这个peg,它就是方向
  5. (如果我们到了这里,第4步产生了一个不希望出现的电路板状态)撤销第4步中的操作,并使用peg可能做出的下一个操作(如果有的话)回忆第4步
  6. 返回到步骤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亿次移动。


共有1个答案

邴姚石
2023-03-14

你需要的是一个调试策略。

使用一种可以输出电路板状态的方法。另外,写一个可以保存你的电路板的表示,还有一个可以比较两个状态,看看它们是否相同。

第一种方法失败后输出,然后在回溯后的不同点确保回溯已回溯到正确的轨迹。

还要确保你不会多次跟踪同一个动作。

至于可能的移动次数,不要太确定。人们不会认为,在国际象棋的前10-20步中,有几十亿种可能的棋步,但确实有。

 类似资料:
  • 我目前正在尝试编写一个程序,将能够找到解决方案的游戏佩格纸牌使用回溯。 我的程序接收一个包含启动板的txt文件。除了solve()函数包含实际的回溯部分之外,所有的事情都完成了,这在概念上对我来说非常困难。我已经在一张纸上写了一段时间,但我认为我没有取得多大进展。任何帮助都将不胜感激。下面的示例txt文件,=peg,

  • 谁能帮帮我吗?

  • 我正在用java制作一个带回溯功能的peg纸牌解析器。 我就是这么做的: 问题是我找不到解决办法。以下是代码的输出:http://pastebin.com/raw.php?i=BhkLu3qr.如您所见,解决方案阵列不完整。 谢谢

  • 我正在做一个小的个人数独游戏,并试图扩展它。 到目前为止,我使用递归回溯方法使“Solve”部分正常工作,每当它设法解决递归时,就会返回true。 现在我正在尝试构建一个独特的解决方案板生成器,我在网上找到了很多关于如何实现它的信息。 然而,我在第一步很挣扎,这是我的布尔递归回溯算法变成一个递归算法,它保留了一个可能解决方案的计数。这对于检查我生成的板是否是唯一的至关重要。 更重要的是,我意识到我

  • 我有下面的课。我试图使getConfig()返回指定的类型,然而,它只作为BaseConfig返回。假设我有扩展BaseConfig的MyConfig,我希望该方法返回MyConfig而不是BaseConfig。我真的很感激任何帮助,因为我似乎找不到合适的解决方案,为我工作。 一些其他类组成了我正在研究的系统: 另一个: