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

递归回溯算法不能解决某些情况

鲜于阳
2023-03-14

我目前正在编程一个递归算法解决一个佩格纸牌游戏。

算法需要使用“回溯”的方法来求解棋盘。我想我已经设法得到了一个非常接近正确的解决方案。看来我的代码正确地为所有可解板解板。它似乎也能正确地确定板何时不可解,但只有当钉住的数量不太高时。

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();
                            }
                        }


                    }
                }
            }
        }
    }

有什么想法吗?

共有1个答案

贺雅健
2023-03-14

因为在peg solitaire中的每一个动作都移除一个peg,所以你不可能循环回到以前的状态:比如说,在简单的路径规划中,机器人可能永远在两个方块之间来回移动。所以不是这样。

那么你的算法错了吗?为了简单起见,它被简化了:

solve (board state) is

if the board is solved, record success
else
   for all possible moves from this board state
      if move is possible
        make it
        call solve
        undo the move

这个算法不可能让你陷入循环;当它递归时,它会更深入搜索空间(即进行移动)。所以不是这样。

这一切都有助于其他人得出的结论:这只是一个大问题。

 类似资料:
  • 我正在为suduko解算器编写一个递归回溯算法。看起来suduko的情况很糟糕。 代码: s是由节点对象组成的。每个节点对象都有一个(x, y)表示板子,一个值,它可以是一个数字,也可以是一个没有赋值的句点,还有一个平方值(suduko的平方是多少)。 我知道,我的方法和都有效检查棋盘是否正确求解,检查如果suduko游戏的约束条件成立,我是否将给定的节点设置为给定棋盘上的给定值。 出于某种原因,

  • 我正在开发高级培养皿网络编辑器/模拟器。首先,这里有一些词汇 圆圈=位置 矩形=过渡 就地整数 = 标记 过渡状态=防护 我被困在通过过渡的守卫。守卫是一个条件,如果你想执行转换,这需要是真的。我知道我应该以某种方式使用回溯,但我不知道在程序开始之前进入过渡的位置数,所以我不能使用循环,因为我不知道我需要多少个循环。 所以,我想从第一位获取第一个令牌,从第二位获取第一令牌,然后尝试通过守卫,如果通

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

  • 我编写了以下程序来递归地实现四色地图定理(简而言之,任何地图只能用4种颜色着色,而没有任何相邻区域是相同的颜色)。一切都在编译,但是我的输出给我错误的数据(每个区域的颜色为-1,而不是现在的值0-3)。我最大的问题是为什么输出不正确。 对于那些想知道的人来说,输入文件是一个邻接矩阵,看起来如下所示: 这是我的代码:

  • 我的任务是用回溯和递归的方法解决一个迷宫。这更多的是一个关于这个概念的概念问题。 回溯电话是如何接通的?从我所看到的所有示例来看,似乎递归总是在回溯步骤之前立即调用,所以回溯是无法实现的。谁能给我解释一下回溯步骤是怎么达到的?

  • 我的问题是,当一个9不能正确添加时,该方法会中断。不知何故,我不知道如何让它回到前一点,并向上数,这将创建一个新的“路径”,所以我想如果我做对了,一切都应该很好。我仍然在使用递归:-/ 正如我所知,我认为Sudokurecrect()做了它应该做的事情。编辑:您可以忽略布尔测试。我知道我不使用它,我试着想一些东西,但显然我不知道如何使用它。 输出为 在那之后,不管检查哪个变体。所以问题是一样的。