Python 迷宫递归
Python Maze Recursion
我正在尝试解决一个通过 python 文本文件给出的迷宫。我 运行 遇到的问题是,当我 运行 通过使用递归的求解器时,它会打印所有可能的路线,但在找到死胡同后不会更改字符。
---------------------
|*************|*|***|
|-+-+-+*+-+-+*+*+*+-|
|***|***|***|*|*****|
|*+-+-+*+*+-+-+-+*+*|
|*******|*|*|*****|*|
|-+-+*+*+*+*+-+*+-+-|
|*****|*************|
|-+*+-+-+-+-+-+*+-+*|
|*****|*********|***|
---------------------
我想让它看起来像什么:
---------------------
|!!!!!!!!!!!!!|!|***|
|-+-+-+!+-+-+!+!+*+-|
|!!!|!!!|!!!|!|!!*!!|
|!+-+-+!+!+-+-+-+*+!|
|!!!!***|!|!|!!***|!|
|-+-+*+*+!+!+-+*+-+-|
|!!***|*********!!!!|
|-+*+-+-+-+-+-+!+-+!|
|***!!|!!!!!!!!!|!!!|
---------------------
我的代码是这样的:
def solver(self,r,c):
if r == (self.endpoint[0]*2) and c == (self.endpoint[1]*2):
return True
if self.reverselist[r][c] != ' ':
return False
self.setStar(r,c)
if self.solver(r-1,c):
self.setExplan(r,c)
return True
if self.solver(r,c+1):
self.setExplan(r,c)
return True
if self.solver(r,c-1):
self.setExplan(r,c)
return True
if self.solver(r+1,c):
self.setExplan(r,c)
return True
return False
编辑:
很抱歉提供的内容太少而造成混淆,我会尝试提供更多内容来解决问题。
所以对于这个程序,我提供了一个文件,它在顶部包含三行。第一行是棋盘的大小(例如 10 20),第二行是起点(例如 1 1),第三行是终点(例如 10 20)。在这三行之后,它包含一个使用 -,+,| 的空迷宫作为墙壁。
这是我在一个单独的函数中调用的 运行 一切
def main():
file_choice = input('Enter files name: ')
lines = open_file('maze510') #change back after !!!!!
mymaze = Maze(lines)
start = mymaze.getStart(lines)
end = mymaze.getEnd(lines)
mymaze.solver(start[0],start[1])
mymaze.displaymaze()
在我在 Maze class 中创建的解算器函数中,它使用 self.endpoint 获取端点并将其乘以二,因为文本文件中给出的数字是仅只考虑星星可以容纳的位置。调用的其他两个方法是 setStar 和 setExplan,它们将 space 设置为星星和解释标记。
def setStar(self,r,c):
self.reverselist[r][c] = '*'
def setExplan(self,r,c):
self.reverselist[r][c] = '!'
从未使用过 Python,所以 运行 没有使用过,但在我看来,您的求解器函数中需要如下内容:
if r == (self.endpoint[0]*2) and c == (self.endpoint[1]*2):
return True
if self.reverselist[r][c] != ' ':
return False
# mark the current attempt as on the route
self.setStar(r,c)
# don't need to setStar or setExplan anywhere while
# trying moves - the recursive functions will do that
if self.solver(r-1,c):
return True
if self.solver(r,c+1):
return True
if self.solver(r,c-1):
return True
if self.solver(r+1,c):
return True
# if we reach here then there is no solution found from
# the current r, c so mark it as ! for backtracking
self.setExplan(r,c)
return False
干杯,
我正在尝试解决一个通过 python 文本文件给出的迷宫。我 运行 遇到的问题是,当我 运行 通过使用递归的求解器时,它会打印所有可能的路线,但在找到死胡同后不会更改字符。
---------------------
|*************|*|***|
|-+-+-+*+-+-+*+*+*+-|
|***|***|***|*|*****|
|*+-+-+*+*+-+-+-+*+*|
|*******|*|*|*****|*|
|-+-+*+*+*+*+-+*+-+-|
|*****|*************|
|-+*+-+-+-+-+-+*+-+*|
|*****|*********|***|
---------------------
我想让它看起来像什么:
---------------------
|!!!!!!!!!!!!!|!|***|
|-+-+-+!+-+-+!+!+*+-|
|!!!|!!!|!!!|!|!!*!!|
|!+-+-+!+!+-+-+-+*+!|
|!!!!***|!|!|!!***|!|
|-+-+*+*+!+!+-+*+-+-|
|!!***|*********!!!!|
|-+*+-+-+-+-+-+!+-+!|
|***!!|!!!!!!!!!|!!!|
---------------------
我的代码是这样的:
def solver(self,r,c):
if r == (self.endpoint[0]*2) and c == (self.endpoint[1]*2):
return True
if self.reverselist[r][c] != ' ':
return False
self.setStar(r,c)
if self.solver(r-1,c):
self.setExplan(r,c)
return True
if self.solver(r,c+1):
self.setExplan(r,c)
return True
if self.solver(r,c-1):
self.setExplan(r,c)
return True
if self.solver(r+1,c):
self.setExplan(r,c)
return True
return False
编辑: 很抱歉提供的内容太少而造成混淆,我会尝试提供更多内容来解决问题。
所以对于这个程序,我提供了一个文件,它在顶部包含三行。第一行是棋盘的大小(例如 10 20),第二行是起点(例如 1 1),第三行是终点(例如 10 20)。在这三行之后,它包含一个使用 -,+,| 的空迷宫作为墙壁。
这是我在一个单独的函数中调用的 运行 一切
def main():
file_choice = input('Enter files name: ')
lines = open_file('maze510') #change back after !!!!!
mymaze = Maze(lines)
start = mymaze.getStart(lines)
end = mymaze.getEnd(lines)
mymaze.solver(start[0],start[1])
mymaze.displaymaze()
在我在 Maze class 中创建的解算器函数中,它使用 self.endpoint 获取端点并将其乘以二,因为文本文件中给出的数字是仅只考虑星星可以容纳的位置。调用的其他两个方法是 setStar 和 setExplan,它们将 space 设置为星星和解释标记。
def setStar(self,r,c):
self.reverselist[r][c] = '*'
def setExplan(self,r,c):
self.reverselist[r][c] = '!'
从未使用过 Python,所以 运行 没有使用过,但在我看来,您的求解器函数中需要如下内容:
if r == (self.endpoint[0]*2) and c == (self.endpoint[1]*2):
return True
if self.reverselist[r][c] != ' ':
return False
# mark the current attempt as on the route
self.setStar(r,c)
# don't need to setStar or setExplan anywhere while
# trying moves - the recursive functions will do that
if self.solver(r-1,c):
return True
if self.solver(r,c+1):
return True
if self.solver(r,c-1):
return True
if self.solver(r+1,c):
return True
# if we reach here then there is no solution found from
# the current r, c so mark it as ! for backtracking
self.setExplan(r,c)
return False
干杯,