Recursion 在给定n耐力的情况下计算图形上的所有端点?

Recursion 在给定n耐力的情况下计算图形上的所有端点?,recursion,graph,maze,Recursion,Graph,Maze,我正在尝试为游戏创建一个寻路算法。基本上,在玩家掷一个数字后,我需要确定玩家可以在网格上结束的所有可能位置。玩家在给定的一步后不能直接向后移动,并且每一步只能移动一个方格 问题是,现在我正试图通过递归地沿着图形导航并手动检查每个有效移动来强制解决方案 伪代码: // Recursive function for navigating one step at a time. function navigate($stamina, $coords, $coords_previous) { /

我正在尝试为游戏创建一个寻路算法。基本上,在玩家掷一个数字后,我需要确定玩家可以在网格上结束的所有可能位置。玩家在给定的一步后不能直接向后移动,并且每一步只能移动一个方格

问题是,现在我正试图通过递归地沿着图形导航并手动检查每个有效移动来强制解决方案

伪代码:

// Recursive function for navigating one step at a time.
function navigate($stamina, $coords, $coords_previous)
{
    // If the movement stamina has not been spent.
    if ($stamina != 0)
    {
        // Note: there may be less than four neighboring
        // cells in a given location due to obstacles.
        foreach ($neighboring_cells as $coords_neighboring)
        {
            // If the coordinates of the neighbor are not the same as the
            // coordinates of the previous move (we can't move backwards)
            if ($coords_neighboring != $coords_previous)
            {
                $stamina--;

                // Recurse.
                navigate($stamina, $coords_neighboring, $coords);
            }
        }
    }
    else
    {
        // No more stamina.
        // Add $coords to our array of endpoints.
    }
}
这适用于小卷(低
$耐力值)。然而,随着
$耐力的增加,这种方法开始变得超级冗余。这是因为玩家可以一次又一次地在圆圈中移动,以指数方式增加潜在端点的数量

我的问题是,如何减少上述功能中的冗余?

将状态定义为网格位置和面(即玩家移动到那里的方向)的组合。这是很有用的,因为我们可以定义给定状态的后继者:特别是那些位于相邻网格位置(具有适当的面)的后继者,而不是玩家刚刚来自的那个

然后计算n步可到达的状态集。对于n=0,这只是玩家的初始位置(如果第一步可以朝任何方向移动,则有一个特殊的“无面向”值)。要计算n+1的移动,请从上一集中的每个状态生成所有有效移动,并丢弃所有重复的移动。当你达到
$stemanity
步数的设定值时,只需丢弃贴面(以及任何重复的位置)

在图算法方面 这类似于在顶点为状态且边将状态连接到后续状态的图上进行广度优先搜索。然而,在这里,我们不会忽略到一个状态的新(更长)路径,因为某些位置可能只有通过循环才能到达(精确地
$stemma
步骤!)。你也可以在状态中包含剩余的耐力(并定义离开状态0步的边缘);然后,您将执行普通的图形搜索并收集所有的叶子


在任何一种情况下都可能是这样,但是直接实现算法比用图表更清晰。

允许玩家提前停止吗?不,玩家只能移动滚动的数字。然而,同样,玩家可以循环移动,因此如果玩家掷五个骰子并移动
向上->向右->向下->向左->向左->向左
,就好像玩家只向左移动了一个方块。你能更详细地说一下吗?我不确定我是否理解饰面的好处,也不完全理解你所说的每一层的开/闭集是什么意思。@Nathanel:我希望这更清楚。在图表搜索方面的措辞确实有些离题,尽管我将其作为附录留作参考。这非常有帮助,谢谢!你的建议极大地提高了我剧本的性能。我还需要再润色一下,但你让我走上了正轨。