一种基于回溯的路径寻找算法

来源:互联网 发布:php抢红包源代码 编辑:程序博客网 时间:2024/06/10 04:24

网格上的机器人:想象一个机器人坐在有r行c列的网格的左上角。这个机器人只能在两个方向移动,向右和向下。有些格子是关闭的,机器人不能移动到这些格子上。设计一个找到一条让机器人从左上角移动到右下角路径的算法。

网格

这里假设有个4X4的网格,有2个带有阴影的格子是关闭的。


算法的思想如下:

从右下角进行回溯,反向寻找路径,直到左上角

1.如果当前格子是左上角,结束返回

2.如果当前格子左边的格子是开放的,把“向右”这条路径保存到栈里面

3.如果当前格子上面的格子是开放的,把“向下”这条路径保存到栈里面

4.如果当前格子左边和上面都是封闭的,删掉栈顶的一条路径并回溯


算法的Python代码实现如下:

row, col = 4, 4a = [[0 for x in xrange(col)] for y in xrange(row)]a[1][0] = 1a[2][2] = 1r = []def f(m,n):    if m==0 and n==0:        return    if a[m][n-1]==0 and n>=1:        r.append("right")        return f(m,n-1)    if a[m-1][n]==0 and m>=1:        r.append("down")        return f(m-1,n)    if m==0 and a[m][n-1]==1:        a[m][n]=1        del r[len(r)-1]        if n==(col-1):            return f(m+1, n)        else:            return f(m, n+1)    if n==0 and a[m-1][n]==1:        a[m][n]=1        del r[len(r)-1]        if m==(row-1):            return f(m, n+1)        else:            return f(m+1, n)f(row-1, col-1)r.reverse()print r


运行结果是:

['right', 'down', 'down', 'down', 'right', 'right']
[Finished in 0.1s]

0 0
原创粉丝点击