递归编程迷宫解决方案

时间:2018-09-17 23:22:59

标签: python

此功能旨在递归地导航迷宫并找到最短路径的长度。路径本身不是必需的,只有长度。迷宫由2d列表表示,其值如

0 1 0 0 0 
0 0 0 1 0
0 0 0 1 0

用户从(0,0)开始,并且必须按照定义在迷宫的末端结束(在我的情况下,它是右下角的单元格)。 1代表墙壁。

def maze(x,y,array,length):
    m = len(array)
    n = len(array[0])
    if x < 0 or y < 0 or x == m or y == n or array[x][y] == 1:
        return float("inf")
    elif x == m - 1 and y == n - 1:
        return length
    else:
        array[x][y] = 1
        up = maze(x - 1,y,array,length + 1)
        right = maze(x,y + 1,array,length + 1)
        down = maze(x + 1,y,array,length + 1)
        left = maze(x,y - 1,array,length + 1)
        return min(up,down,left,right)


array = [[0,1,0,0,0],[0,0,0,1,0],[0,0,0,1,0]]
minLength = maze(0,0,array,1)
print(minLength)

我对其进行了设计,以便它可以递归地找到每个方向(上,下,左和右)的所有可能路径,并在路径的每一步中返回所有这些路径中的最小值。对于无效路径,它将返回inf。

对于这个特定的数组,它返回11,这是假的,应该是9。我不认为这只是一个数学错误,因为我尝试打印方法的每一步,并且无法识别某些路径(它对于最肯定具有选项的路径返回inf)。

我似乎找不到我的代码出了问题的地方,似乎它应该正确返回值,但实际上却没有。

1 个答案:

答案 0 :(得分:1)

array是对原始数组的引用,而不是本地副本。查看有关Python如何传递函数参数或如何处理列表的任何在线教程。您可以在调用array之后在主程序中打印maze来看到效果:

Final Maze [
    [1, 1, 1, 1, 1],
    [1, 1, 1, 1, 1],
    [1, 1, 1, 1, 0]
]

解决此问题相对容易:复制嵌套列表并在本地使用该副本。

from copy import deepcopy

def maze(x,y,array,length):
    m = len(array)
    n = len(array[0])
    if x < 0 or y < 0 or x == m or y == n or array[x][y] == 1:
        return float("inf")
    elif x == m - 1 and y == n - 1:
        return length
    else:
        new_maze = deepcopy(array)
        new_maze[x][y] = 1
        up = maze(x - 1,y,new_maze,length + 1)
        right = maze(x,y + 1,new_maze,length + 1)
        down = maze(x + 1,y,new_maze,length + 1)
        left = maze(x,y - 1,new_maze,length + 1)
        return min(up,down,left,right)


array = [[0,1,0,0,0],[0,0,0,1,0],[0,0,0,1,0]]
minLength = maze(0,0,array,1)
print("Final Maze", array)
print(minLength)

此输出(再次进行编辑以提高可读性)

Final Maze [
    [0, 1, 0, 0, 0],
    [0, 0, 0, 1, 0],
    [0, 0, 0, 1, 0]
]
9