Хорошо, в общем, я пытаюсь выполнить поиск в глубину для пасьянса с мини-колышками. Для тех, кто не знаком с игрой, все довольно просто.
Есть доска с 10 лунками и 9 колышками, колышек представлен 1, а пустое пятно - 0. Вы можете перемещать колышек назад или вперед на две лунки за раз (но вы можете двигаться только на пустой отверстие), и если в процессе вы перепрыгиваете через другой колышек, вы вынимаете его, и он становится дырой.
Вот как выглядит игра:
[1, 1, 1, 1, 1, 0, 1, 1, 1, 1]
[1, 1, 1, 0, 0, 1, 1, 1, 1, 1]
[1, 0, 0, 1, 0, 1, 1, 1, 1, 1]
[1, 0, 0, 1, 1, 0, 0, 1, 1, 1]
[1, 0, 0, 0, 0, 1, 0, 1, 1, 1]
[1, 0, 0, 0, 0, 1, 1, 0, 0, 1]
[1, 0, 0, 0, 0, 0, 0, 1, 0, 1] #etc until only 1 peg left
Итак, у меня есть функция генератора, которая находит все допустимые ходы для определенного "узла" или игрового поля:
def succ(self, node):
size = len(node)
# find all legal moves going forward
for pos in range(0, size-1):
new_node = list(node)
if ((node[pos] == 1) and (pos < (size - 2)) and (node[pos+2] == 0)):
new_node[pos] = 0 # we're moving now
new_node[pos+2] = 1 # this is where we're moving the peg to
new_node[pos+1] = 0 # take out the peg here if there was one
yield new_node
# find all legal moves going backwards
for pos in range(0, size-1):
new_node = list(node)
if ((node[pos] == 1) and (pos > 1) and (node[pos-2] == 0)):
new_node[pos] = 0 # we're moving now
new_node[pos-2] = 1 # this is where we're moving the peg
new_node[pos-1] = 0 # take out the peg here if there was one
yield new_node
Теперь, если вы знаете поиск в глубину, это похоже на БОЛЬШОЙ генератор, который можно использовать при решении этой головоломки. Либо это? (Я думаю, что, может быть, вы можете помочь придумать более Pythonic способ?)
Ну, моя функция решения рекурсивных головоломок, которая будет использовать генератор, не работает, может, вы мне поможете?
def goal(self, node):
pegs = 0
for pos in node:
if pos == 1:
pegs += 1
return (pegs == 1) # returns True if there is only 1 peg
def solve_board(dfs_obj, node):
if goal(node): # only 1 peg!
print node
return node
for new_node in succ(node):
print new_node
return solve_board(new_node)
if __name__ == "__main__":
solve_board([1, 1, 1, 1, 1, 0, 1, 1, 1, 1])
Так что, в принципе, я думаю, что моя функция succ () делает правильные вещи (может, это не так?), Но моя рекурсия solve_board () может быть прикольной, потому что плата не решает.