Recursion 网格中的机器人-如何获得所有可能的路径
我试图解决这个问题: 有一个包含r行和c列的网格。坐在左上角牢房的机器人只能向两个方向移动,右下。但是某些细胞必须避免,机器人不能踩到它们。从左上角到右下角查找机器人的路径 这个问题特别需要一条路径,这似乎是直截了当的: 将网格设置为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)//我们到达 找到
布尔[][]
,我的伪代码是
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/递归解决方案,但却找不到任何解决方案。很难想象递归是以两种方式进行的
有什么建议吗?此外,对于如何“思考”此类问题的任何一般性帮助都将不胜感激:)
有什么建议吗?此外,对于如何“思考”此类问题的任何一般性帮助都将不胜感激:)
解决问题的方法:
[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我编辑了答案以适合你的整个问题:-)哇,非常感谢,非常感谢!让我花点时间试着理解这一点,然后接受答案!