2015-01-31 155 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