【问题标题】:Calculate all end points on a graph given n stamina?在给定 n 耐力的情况下计算图上的所有端点?
【发布时间】:2017-10-23 00:36:37
【问题描述】:

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

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

伪代码:

// 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.
    }
}

这适用于小卷(低$stamina 值)。然而,随着$stamina 的增加,这种方法开始变得超级多余。这是因为玩家可以一遍又一遍地绕圈移动,从而成倍增加潜在端点的数量。

我的问题是,可以做些什么来减少上述函数的冗余?

【问题讨论】:

  • 玩家可以提前停止吗?
  • 不行,玩家只能移动掷出的数字。然而,同样,玩家可以绕圈移动,所以如果玩家掷出 5 并移动 up->right->down->left->left,就好像玩家只向左移动了一个格子。

标签: recursion graph maze


【解决方案1】:

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

然后计算在 n 个步骤中可达的状态集。对于 n=0,这只是玩家的初始位置(如果第一步可以朝任何方向,则具有特殊的“不面向”值)。要为 n+1 计算它,请从前一组中的每个状态生成所有有效移动,丢弃任何重复。当您到达$stamina 步骤的集合时,只需丢弃饰面(以及任何重复的位置)。

在图算法方面

这类似于在图上的广度优先搜索,其顶点是状态,其边将状态连接到其后继状态。但是,在这里我们不会忽略新的(更长的)路径到一个状态,因为某些位置可能只能通过循环到达(完全$stamina 步骤!)。还可以包括状态中剩余的耐力(并且定义没有远离状态的边缘,向左移动 0);然后您将执行正常的图形搜索并收集所有叶子。

在任何一种情况下,这些都可能是implicit graphs,但算法更清晰的是直接实现而不是根据图表。

【讨论】:

  • 你能详细点吗?我不确定我是否理解面对的好处,我也不完全理解您所说的每个级别的开放/封闭集的含义。
  • @Nathanael:我希望这更清楚。图表搜索方面的措辞确实有点离题,尽管我将其作为附录保留以供参考。
  • 这很有帮助,谢谢!您的建议显着提高了我的脚本的性能。我还需要再润色一点,但你让我走上了正确的道路。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多