Java 谜题中的深度优先搜索和回溯
我正在尝试在我的算法中添加深度优先搜索,以找到Peg纸牌游戏的解决方案。现在,我的算法似乎退出得太快了,因为它还没有找到解决方案 如果电路板上只剩下1个销钉,则可以找到解决方案 下面是我的函数Java 谜题中的深度优先搜索和回溯,java,algorithm,nodes,depth-first-search,backtracking,Java,Algorithm,Nodes,Depth First Search,Backtracking,我正在尝试在我的算法中添加深度优先搜索,以找到Peg纸牌游戏的解决方案。现在,我的算法似乎退出得太快了,因为它还没有找到解决方案 如果电路板上只剩下1个销钉,则可以找到解决方案 下面是我的函数findSolution(),它是一个递归函数 方向包含板上上上下左右移动的所有坐标 doJump在参数中的板上进行移动 undoJump直接撤消网格上的移动 grid是一个类变量,它是当前状态下的游戏网格 在我添加seenBoards之前,该算法运行良好,但我添加了它,因为它访问的节点太多了。我正在努
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
中删除网格的行是否有错误
深度优先搜索我遗漏了什么?欢迎任何意见
我正在使用这些指南来尝试使其工作:
谢谢 什么是
seenBoards
?方法是否正确比较网格?它在哪里初始化?