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

网格中的机器人——如何获得所有可能的路径

柯新翰
2023-03-14

我试图解决这个问题:

有一个包含r行和c列的网格。坐在左上角牢房里的机器人只能向两个方向移动,右下。但某些细胞必须避免,机器人不能踩到它们。从左上角到右下角为机器人找到一条路径。

这个问题特别需要一条路径,这似乎是直截了当的:

将网格设置为布尔[][],我得到的伪代码是

List<String> path = new ArrayList<String>()
boolean found = false

void getPath(r, c){
    if (!found) {

      if ( (r or c is outofbounds) || (!grid[r][c]) )
          return

      if (r==0 AND c==0)  // we reached
           found = true

      getPath(r-1, c)
      getPath(r, c-1)

      String cell = "(" + r + ", " + c + ")"
      path.add(cell)

    }    
}

尽管我想知道如何获得所有可能的路径(不仅是计数,还有路径值)。注意,它有r行和c列,所以它不是nxn网格。我试图想出一个DP/递归的解决方案,但却找不到任何解决方案,而且陷入了困境。很难想象递归是以两种方式进行的。

有什么建议吗?此外,对于如何“思考”此类问题的任何一般性帮助,我们都将不胜感激:)。

共有1个答案

唐博文
2023-03-14

有什么建议吗?此外,对于如何“思考”此类问题的任何一般性帮助,我们都将不胜感激:)。

解决问题的方法:

  1. 在头脑中构建问题的图G。在这种情况下,顶点是网格中的单元,在存在有效机器人移动的位置创建定向边

实际上,你不需要构造图,因为边的集合非常清晰,或者像通常一样进行拓扑排序,矩阵的迭代(增量行索引和增量列索引)是这种隐式图的拓扑排序。

计算后,答案存储在dp[n-1][m-1]中,n是行数,m是列数。总运行时间为O(nm)

如何找到所有可能的有效路径:
通常的回溯是有效的,我们可以通过应用早期修剪来加速回溯。事实上,如果我们计算dp矩阵,然后从单元[n-1][m-1]进行回溯,我们可以避免机器人进入dp值为零的单元时出现无效路径。

预先计算了dp矩阵的Python代码

n, m = 3, 4
bad = [[False, False, False, False],
       [ True,  True, False, False],
       [False, False, False, False]]
dp = [[1, 1, 1, 1], 
      [0, 0, 1, 2], 
      [0, 0, 1, 3]]

paths = []
curpath = []
def getPath(r, c):
    if dp[r][c] == 0 or r < 0 or c < 0:
        return
    curpath.append((r, c))
    if r == 0 and c == 0:
        paths.append(list(reversed(curpath)))
    getPath(r - 1, c)
    getPath(r, c - 1)
    curpath.pop()

getPath(n - 1, m - 1)
print(paths)

# valid paths are [[(0, 0), (0, 1), (0, 2), (0, 3), (1, 3), (2, 3)], 
#                  [(0, 0), (0, 1), (0, 2), (1, 2), (1, 3), (2, 3)], 
#                  [(0, 0), (0, 1), (0, 2), (1, 2), (2, 2), (2, 3)]]

请注意,这与您的代码非常相似,需要将所有有效路径存储在一起,并注意附加列表是curpath的副本,以避免以空列表结束。

 类似资料:
  • 我不明白下面这个问题的路径数是(xy)/十、Y我理解它来自于从一个X-Y项目路径中选择X项目,但为什么它不选择X项目而不是X-Y选择Y项目而不是X-Y呢?为什么只有x? 机器人位于m x n网格的左上角(下图中标记为“开始”)。机器人只能在任何时间点向下或向右移动。机器人正试图到达网格的右下角(下图中标记为“Finish”)。有多少条可能的路径? 所有这些路径都是唯一的吗? 我怎么确定? 回溯算法

  • Random#nextLong()文档指出,此方法不会返回所有可能的长值: 返回此随机数生成器序列中的下一个伪随机、均匀分布的long值。的一般约定是伪随机生成并返回一个long值。方法由Random类实现,就好像通过: 因为类Random使用的种子只有48位,所以该算法不会返回所有可能的长值。 例如,数字是可生成的,但数字不是,即使它们唯一的区别是一个最低有效位,并且值本身是63位长。 有一种方

  • 我需要以编程方式获取所有路由的路径列表。 我尝试了-在L5中不工作-不是静态方法。 我敢打赌,我可以从获取,但我不知道怎么做。

  • 我有一个随机二叉树,形式如下 12个 13,14 29, 26, 89 每个节点有两个子节点,即(12- 树的分类 根左=树(13) 根右=树(14) 根正当左=树(26) 根左边右=树(26) 根左边左=树(29) 根正当右=树(86)

  • 问题内容: 我有一个使用Node.js和Express构建的Web应用程序。现在,我想用适当的方法列出所有已注册的路由。 例如,如果我执行过 我想检索一个对象(或等效的东西),例如: 这可能吗?如果可以,怎么办? 更新: 同时,我创建了一个名为get-routes的npm软件包,该软件包从给定的应用程序中提取路由,从而解决了此问题。当前,仅支持Express 4.x,但我想现在可以了。仅供参考。