Python 使用递归构建映射?
我正在编写一个程序,导入符号地图并递归导航地图。它已经完成了,几乎可以用了,但不管出于什么原因,地图总是跳过一个点,我也不知道为什么。它应该用“X”标记正确的路径,而不使用“+”的部分。如果有人可以检查这一点,并找到一个错误,我错过了,这将是非常感谢 我要穿过的网格 看起来像这样: 当您使用网格运行代码时,它也会保留一些字符不变,并且无论我将代码放在何处,它都会完全忽略它。我试着把一些东西放进去,比如:Python 使用递归构建映射?,python,recursion,Python,Recursion,我正在编写一个程序,导入符号地图并递归导航地图。它已经完成了,几乎可以用了,但不管出于什么原因,地图总是跳过一个点,我也不知道为什么。它应该用“X”标记正确的路径,而不使用“+”的部分。如果有人可以检查这一点,并找到一个错误,我错过了,这将是非常感谢 我要穿过的网格 看起来像这样: 当您使用网格运行代码时,它也会保留一些字符不变,并且无论我将代码放在何处,它都会完全忽略它。我试着把一些东西放进去,比如: for i in grid: for j in i: if j =
for i in grid:
for j in i:
if j == "|":
j = "+"
if j == "#":
j = "+"
我运行它的代码是:
grid = []
def buildGrid ():
with open("Maze.txt" , "r") as f:
for line in f:
chars = []
for c in line:
if c != "\n":
chars.append(c)
grid.append(chars)
freeMouse(0, 0)
def showPath ():
result = ""
for i in grid:
for j in i:
result += " "
result += j
result += "\n"
print(result)
def freeMouse (x, y):
if grid[y][x] == "O":
grid[0][0] = "S"
showPath()
elif grid[y][x] == "X":
return False
elif grid[y][x] == ("|"):
grid[y][x]= "+"
return False
elif grid[y][x] == ("+"):
return False
print("false")
grid[y][x] = "X"
if x != 0:
if y != 0:
left = freeMouse (x-1, y)
up = freeMouse(x, y -1)
if len(grid) == y + 1:
if len(grid[y]) != x+1:
right = freeMouse (x + 1, y)
if not right:
grid[y][x+1] = "+"
else:
if len(grid[y]) == x+1:
down = freeMouse(x, y+1)
else:
down = freeMouse(x, y+1)
right = freeMouse (x + 1, y)
if not right:
grid[y][x+1] = "+"
if not down:
grid[y+1][x] = "+"
if not up:
grid[y-1][x] = "+"
if not left:
grid[y][x-1] = "+"
else:
if len(grid[y])== x + 1:
left = freeMouse (x-1, y)
down = freeMouse (x, y+1)
else:
left = freeMouse (x-1, y)
down = freeMouse (x, y+1)
right = freeMouse (x+1, y)
if not right:
grid[y][x+1] = "+"
if not down:
grid[y+1][x] = "+"
if not left:
grid[y][x-1] = "+"
else:
if y != 0:
if len(grid) == y + 1:
up = freeMouse(x,y-1)
right = freeMouse (x+1, y)
else:
up = freeMouse(x, y-1)
down = freeMouse(x, y+1)
right = freeMouse(x + 1, y)
if not down:
grid[y+1][x] = "+"
if not up:
grid[y-1][x] = "+"
else:
down = freeMouse(x, y+1)
right = freeMouse(x+1, y)
if not down:
grid[y+1][x] = "+"
buildGrid()
我试着运行你的代码,得到了以下输出
S X + + X X X X X X
X + + X + X + + + X
+ X + + + X | # + X
+ X X X X X # # + X
+ + + + + | | | + X
+ + | + X X X X + X
+ + + X X | + X X X
+ + + X X # | + + +
+ + + + X + + X X X
+ + + + X X X X + O
我看到一些未经处理的备件。
我觉得问题在于返回语句——您应该记住‘notnone==True’
您可以通过打开python控制台并键入以下命令来测试这一点
def func():
return
print not func(); // This returns true
因此,我建议删除“if not up”、“if not down”等语句
if grid[y][x] == "O":
grid[0][0] = "S"
showPath()
# To stop from endless recursion -- don't go back to traversed path
elif grid[y][x] == "X":
return False
# Don't run into wall
elif grid[y][x] == ("|"):
grid[y][x]= "+"
return False
# Don't run into locations already not traversable
elif grid[y][x] == ("+"):
grid[y][x]= "+"
return False
print("false")
# Mark path as traversed
grid[y][x] = "X"
# If not at left end -- to avoid boundary issues
if x != 0:
# If not at top end
if y != 0:
left = freeMouse (x-1, y)
up = freeMouse(x, y -1)
# If at bottom end
if len(grid) == y + 1:
# If not at right end -- traverse right
if len(grid[y]) != x+1:
right = freeMouse (x + 1, y)
# If not at bottom end
else:
# If at right end -- traverse down
if len(grid[y]) == x+1:
down = freeMouse(x, y+1)
# If not at right end -- traverse down or right
else:
down = freeMouse(x, y+1)
right = freeMouse (x + 1, y)
# If you are at top end
else:
# If you are at right end
if len(grid[y])== x + 1:
# Traverse left or down
left = freeMouse (x-1, y)
down = freeMouse (x, y+1)
else:
# Traverse left, down, or right
left = freeMouse (x-1, y)
down = freeMouse (x, y+1)
right = freeMouse (x+1, y)
# If you are at left end
else:
# If you aren't at top end
if y != 0:
# If you are at right end
if len(grid) == y + 1:
# Try to traverse right or up
up = freeMouse(x,y-1)
right = freeMouse (x+1, y)
else:
# Try to traverse up, down, right
up = freeMouse(x, y-1)
down = freeMouse(x, y+1)
right = freeMouse(x + 1, y)
# If you are at top end
else:
# Try to traverse down or right
down = freeMouse(x, y+1)
right = freeMouse(x+1, y)
如果需求只是从开始导航到结束,我觉得您可以大大简化代码
def freeMouse (x, y):
if x < 0 or y < 0 or y+1 > len(grid) or x+1 > len(grid[y]):
return
if grid[y][x] == "O":
grid[0][0] = "S"
showPath()
elif grid[y][x] == "X":
return
elif grid[y][x] == ("|"):
grid[y][x]= "+"
return
elif grid[y][x] == ("+"):
return
grid[y][x] = "X"
freeMouse(x-1,y)
freeMouse(x+1,y)
freeMouse(x,y-1)
freeMouse(x,y+1)
return
def自由鼠标(x,y):
如果x<0或y<0或y+1>len(网格)或x+1>len(网格[y]):
返回
如果网格[y][x]=“O”:
网格[0][0]=“S”
showPath()
elif网格[y][x]=“x”:
返回
elif网格[y][x]==(“|”)为:
网格[y][x]=“+”
返回
elif网格[y][x]==(“+”):
返回
网格[y][x]=“x”
自由鼠标(x-1,y)
自由鼠标(x+1,y)
自由鼠标(x,y-1)
自由鼠标(x,y+1)
返回
但话说回来,我不太确定你的要求。
如果上述解决方案不适用于您,请告知我请提供您正在使用的输入文件,以便问题重现。另外,发布你得到的结果。你的代码有很多问题。函数
freeMouse
从不返回True
;唯一的返回值是False
和None
。返回语句之后有一个无法访问的print语句。连续多次调用freeMouse而不检查返回值,这意味着您的程序可以在找到迷宫路径后继续查找迷宫路径。您给出的第一个代码段没有任何作用,因为您修改了循环变量,而不是网格。如果你认为代码“几乎可以工作”,那你就错了。我建议你首先在概念原子函数中定义/重构部分代码,然后在组合它们之前独立测试每个函数。这会给你一个逐步解决问题的方法。