Java 谜题中的深度优先搜索和回溯

Java 谜题中的深度优先搜索和回溯,java,algorithm,nodes,depth-first-search,backtracking,Java,Algorithm,Nodes,Depth First Search,Backtracking,我正在尝试在我的算法中添加深度优先搜索,以找到Peg纸牌游戏的解决方案。现在,我的算法似乎退出得太快了,因为它还没有找到解决方案 如果电路板上只剩下1个销钉,则可以找到解决方案 下面是我的函数findSolution(),它是一个递归函数 方向包含板上上上下左右移动的所有坐标 doJump在参数中的板上进行移动 undoJump直接撤消网格上的移动 grid是一个类变量,它是当前状态下的游戏网格 在我添加seenBoards之前,该算法运行良好,但我添加了它,因为它访问的节点太多了。我正在努

我正在尝试在我的算法中添加深度优先搜索,以找到Peg纸牌游戏的解决方案。现在,我的算法似乎退出得太快了,因为它还没有找到解决方案

如果电路板上只剩下1个销钉,则可以找到解决方案

下面是我的函数
findSolution()
,它是一个递归函数

  • 方向
    包含板上上上下左右移动的所有坐标

  • doJump
    在参数中的板上进行移动

  • undoJump
    直接撤消网格上的移动

  • grid
    是一个类变量,它是当前状态下的游戏网格

在我添加
seenBoards
之前,该算法运行良好,但我添加了它,因为它访问的节点太多了。我正在努力使它更快

public boolean findSolution(int[][] board) {

if(nbPegs == 1) return true;

    for(int rowIndex = 0; rowIndex < rowNb; rowIndex++)
    {
        for(int colIndex = 0; colIndex < columnNb; colIndex++)
        {
            for (Point dir : direction)
            {

                if (isValid(rowIndex, colIndex, dir.x, dir.y)) {
                    int[][] newGrid = doJump(board, rowIndex, colIndex, dir.x, dir.y);
                    if (!seenBoards.contains(newGrid)){
                        grid = doJump(board, rowIndex, colIndex, dir.x, dir.y);
                        seenBoards.add(newGrid);

                        if (findSolution(newGrid)) return true;
                        seenBoards.remove(newGrid);
                        undoJump(rowIndex, colIndex, dir.x, dir.y);

                    }
                }
            }
        }
    }
    return false;
}
公共布尔查找解决方案(int[][]板){
如果(nbPegs==1)返回true;
对于(int-rowIndex=0;rowIndex
所以现在就像我说的,这个代码输出没有解决方案,即使有一个。当它应该是几千个节点时,它只经过8个节点

为什么这么早就结束了?从
seenBoards
中删除网格的行是否有错误

深度优先搜索我遗漏了什么?欢迎任何意见

我正在使用这些指南来尝试使其工作:

我还检查了这些其他StackOverflow问题,同时试图了解我的算法有什么问题,但运气不好


谢谢

什么是
seenBoards
方法是否正确比较网格?它在哪里初始化?