此功能旨在递归地导航迷宫并找到最短路径的长度。路径本身不是必需的,只有长度。迷宫由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)。
我似乎找不到我的代码出了问题的地方,似乎它应该正确返回值,但实际上却没有。
答案 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