2015-01-31 136 views
1

我想解决一个通过python文本文件给出的迷宫。我遇到的问题是,当我运行使用递归的求解器时,它会打印任何可能的路径,但在找到死角后不会更改字符。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),第二行是起点(例如11),第三行包含终点(例如20 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() 

在我创建的求解器功能的迷宫类,它使用的self.endpoint获得端点和两个因为它乘以在文本文件中给出的数字只是一个数字,只能计算一个恒星可以容纳的点。另外两个称为setStar和setExplan的方法将空间设置为星号和解释标记。

def setStar(self,r,c): 
     self.reverselist[r][c] = '*' 

def setExplan(self,r,c): 
     self.reverselist[r][c] = '!' 
+0

你怎么知道右上角是出口? – 2015-01-31 22:57:09

+0

@EugeneK我用r ==(self.endpoint [0] * 2)和c ==(self.endpoint [1] * 2)。 self.endpoint发现端点的方法的一部分,因为它在文本文档的2行中给出。 – Liam87 2015-01-31 23:01:07

+0

我们可能需要查看更多的代码。例如,'self.setExplan'是做什么的?一般来说,如果您可以提供足够的上下文来运行代码并确切知道它在做什么,这会很有帮助 - 请参阅[SSCCE](http://sscce.org/)。 – lvc 2015-01-31 23:07:39

回答

0

从未使用过的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 

干杯,

+0

我不确定它是否与我的程序的另一部分有问题,但这只会用感叹号填充整个迷宫。编辑:对不起,只是用固定值检查它,它不正确地检测到结束,它似乎工作只需要修复我的功能的其他部分。谢谢您的帮助。 – Liam87 2015-02-01 20:15:30