2015-01-31 3 views
1

Я пытаюсь решить лабиринт, который передается через текстовый файл с помощью python. Проблема, с которой я сталкиваюсь, заключается в том, что когда я бегу с помощью решателя, который использует рекурсию, он печатает любой возможный маршрут, но не меняет характер после обнаружения тупика.Python Maze Recursion

--------------------- 
|*************|*|***| 
|-+-+-+*+-+-+*+*+*+-| 
|***|***|***|*|*****| 
|*+-+-+*+*+-+-+-+*+*| 
|*******|*|*|*****|*| 
|-+-+*+*+*+*+-+*+-+-| 
|*****|*************| 
|-+*+-+-+-+-+-+*+-+*| 
|*****|*********|***| 
--------------------- 

То, что я пытаюсь заставить его выглядеть следующим образом:

--------------------- 
|!!!!!!!!!!!!!|!|***| 
|-+-+-+!+-+-+!+!+*+-| 
|!!!|!!!|!!!|!|!!*!!| 
|!+-+-+!+!+-+-+-+*+!| 
|!!!!***|!|!|!!***|!| 
|-+-+*+*+!+!+-+*+-+-| 
|!!***|*********!!!!| 
|-+*+-+-+-+-+-+!+-+!| 
|***!!|!!!!!!!!!|!!!| 
--------------------- 

Это то, что мой код выглядит следующим образом:

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 

Edit: Извините за предоставление так мало и что делает это смущает, я постараюсь предоставить больше, чтобы разобраться.

Для этой программы мне предоставляется файл, который содержит три строки вверху. Первая строка - размер платы (например, 10 20), вторая - начальная точка (ex.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 он использует self.endpoint, чтобы получить конечную точку и умножает его на два, потому что число, указанное в текстовом файле, - это число, которое учитывает только пятна, в которые может поместиться звезда. Другие два метода называются setStar и setExplan, которые задают пространство звездочке и маркеровку.

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

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

Как вы знаете, верхний правый - выход? –

+0

@EugeneK Я использовал r == (self.endpoint [0] * 2) и c == (self.endpoint [1] * 2). self.endpoint часть метода, который находит конечную точку, как она указана в текстовом документе в 2 строке. – Liam87

+0

Возможно, нам понадобится еще немного кода. Например, что делает 'self.setExplan'? В общем, полезно, если вы можете предоставить достаточно контекста, который мы можем * запустить * ваш код и убедиться в том, что он делает, - см. [SSCCE] (http://sscce.org/). – lvc

ответ

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