我正在编写一个递归算法来解决弹球纪游戏。
该算法需要使用“回溯”方法来解决问题。我认为我已经成功地找到了一个非常接近正确解的方案。据看,我的代码可以正确地解决所有可解的棋盘问题。它也似乎可以正确地确定何时棋盘是不可解的,但仅当钉子数量不太高时才行。
我的递归方法如下:
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。
我的撤销方法弹出最后一个移动并将棋盘恢复到之前的布局(在执行弹出的移动之前)。
似乎对于大约25个以上木棒的随机棋盘,程序根本不会终止。它会无限期地继续处理。 有解的棋盘和带有较少木棒的各种无解棋盘似乎在10秒内始终以正确的结果终止。
有任何想法吗?
(7*7*4)!
,这个数量非常巨大。 - Pham Trung