我目前正在编写一个递归算法来解决 Peg Solitaire 游戏。
该算法需要使用“回溯”的方法来解决棋盘。我想我已经设法得到了一个非常接近正确的解决方案。看来我的代码正确地解决了所有可解板的问题。它似乎也正确地确定了板何时不可解,但仅当钉子的数量不太高时。
我的递归方法如下所示:
public static void solve()
{
if(isSolved())
{
long endTime=System.currentTimeMillis();
System.out.println("Solved");
solved=true;
printArr(board);
}
else
{
for(int i=0;i<7;i++)
{
for(int j=0;j<7;j++)
{
for (int k=0;k<4;k++)
{
if(makeMove(new int[]{i,j,k}))
{
if(solved!=true)
{
solve();
undoMove();
}
}
}
}
}
}
}
该板是标准的 Peg Solitaire 板。我确信我的 isSolved() 方法正确地确定了板子是否已解决。我的 makeMove 函数接受行、列和方向(i、j 和 k)。它在这些坐标处找到钉子并检查它是否可以将其移动到请求的方向。如果可以,它会移动,将移动添加到移动数组中,然后返回 true。如果不是,则返回 false。
我的 undo 方法从数组中弹出最后一个动作,并将棋盘恢复到以前的布局(在弹出动作之前)。
似乎对于大约 25 个或更多钉子的随机板,程序根本不会终止。它无限期地继续处理。可解板和具有较少钉子的各种不可解板似乎始终会在 10 秒内以正确的结果终止。
有任何想法吗?