好吧,所以基本上我試圖做一個深度優先的搜索迷你釘書面遊戲。對於那些不熟悉遊戲的人來說,這很簡單。在Python中的深度優先搜索
有一個有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()遞歸可能是時髦的,因爲主板不解決。
http://stackoverflow.com/questions/2137731/depth-first-search-in-python – 2010-01-28 00:10:11
是的,這些答覆都沒有幫助,因爲沒有任何答案遵循我必須使用的界面(即succ()函數)。我討厭人們如何愛給出神祕的答案,我的意思是來吧,只是幫助我,所以我可以去喝我悲慘的生活了。 – y2k 2010-01-28 00:12:55