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

Recursion 网格中的机器人-如何获得所有可能的路径,recursion,dynamic-programming,Recursion,Dynamic Programming,我试图解决这个问题: 有一个包含r行和c列的网格。坐在左上角牢房的机器人只能向两个方向移动,右下。但是某些细胞必须避免,机器人不能踩到它们。从左上角到右下角查找机器人的路径 这个问题特别需要一条路径,这似乎是直截了当的: 将网格设置为布尔[][],我的伪代码是 List path=new ArrayList() 布尔值=false void getPath(r,c){ 如果(!找到){ 如果((r或c在边界外)| |(!grid[r][c])) 返回 如果(r==0和c==0)//我们到达 找到

我试图解决这个问题:

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

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

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

List path=new ArrayList()
布尔值=false
void getPath(r,c){
如果(!找到){
如果((r或c在边界外)| |(!grid[r][c]))
返回
如果(r==0和c==0)//我们到达
找到=真
getPath(r-1,c)
getPath(r,c-1)
字符串单元格=“(“+r+”,“+c+”)
添加路径(单元格)
}    
}
尽管我想知道如何获得所有可能的路径(不仅是计数,还有路径值)。注意,它有r行和c列,所以它不是nxn网格。我正试图想出一个DP/递归解决方案,但却找不到任何解决方案。很难想象递归是以两种方式进行的

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

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

解决问题的方法:

  • 在头脑中构建问题的图形。在这种情况下,顶点是网格中的单元,并在存在有效机器人移动的位置创建定向边
  • 搜索G的属性。在这种情况下,G是一个DAG(有向无环图)
  • 使用这些属性来制定解决方案。在这种情况下(G是DAG),通常使用拓扑排序动态规划来查找有效路径的数量
  • 实际上,你不需要构造图,因为边的集合非常清晰,或者像通常一样进行拓扑排序,矩阵的迭代(增量行索引和增量列索引)是这种隐式图的拓扑排序

    动态规划部分可以通过在每个单元格中存储从
    [x][y]
    [x][y]
    的有效路径量,并检查下一步移动的位置来解决。
    重复性:

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

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

    事先计算了
    dp
    矩阵的Python代码:

    n,m=3,4
    坏=[[False,False,False,False],
    [对,对,错,错],
    [假,假,假,假]]
    dp=[[1,1,1,1],
    [0, 0, 1, 2], 
    [0, 0, 1, 3]]
    路径=[]
    curpath=[]
    def getPath(r,c):
    如果dp[r][c]==0或r<0或c<0:
    返回
    curpath.append((r,c))
    如果r==0且c==0:
    append(list(reversed(curpath)))
    getPath(r-1,c)
    getPath(r,c-1)
    curpath.pop()
    getPath(n-1,m-1)
    打印(路径)
    #有效路径为[[(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
    的副本,以避免以空列表结束


    运行时:
    O((n+m)*(有效路径的数量))
    ,因为模拟机器人移动属于有效路径,或者第一步进入使用预见(
    dp
    )检测到的无效路径。警告:此方法与有效路径的数量成指数关系。

    您所解释的内容是有意义的,它可以用于计算路径的总数,但它将返回一个类似于
    [[0,1,1][1,2,3][1,3,6]]
    (对于3行3列),但如何从该矩阵推断实际路径值?i、 e.本例中的6条路径。@Ufder As路径的数量最多可以是一次取n个(n+m)元素的组合,而无需重复。当迭代所有有效路径时,最佳运行时间是使用O(1)修剪进行回溯(无效路径是指在dp值为零的单元格中步进的路径)。最好开始从单元格[n-1][m-1]到[0][0]的回溯,以便在创建无效路径时正确修剪。再次感谢,但可能我没有说清楚。我确实是在回溯,从最后一个单元格开始,到(0,0)结束,即执行自底向上的递归。我可以很好地得到计数。但我不清楚如何获得实际路径,例如,
    [[(0,0)、(0,1)、(1,1)、(1,2)、(2,2)],[(0,0)、(0,1)、(1,1)、(2,1)、(2,2)]
    ,其中有两条路径从开始到结束包含单元格地址。这就是我要找的。@Ufder我编辑了答案以适合你的整个问题:-)哇,非常感谢,非常感谢!让我花点时间试着理解这一点,然后接受答案!