您好,登錄后才能下訂單哦!
使用python實現三壺謎題的方法?針對這個問題,這篇文章詳細介紹了相對應的分析和解答,希望可以幫助更多想解決這個問題的小伙伴找到更簡單易行的方法。
這里的第一個數就代表著是那個8品脫的瓶子,依次分別是8品脫,5品脫,3品脫
就如同上圖一樣,使用層次遍歷一次一次遞歸擴展新的結點,知道找到4品脫的水或者無結點可擴展為止(類似于廣度優先遍歷)。
節點包括兩個屬性,一個屬性是數組類型的,存儲當前三個水壺的容量狀態,另一個屬性是記錄它是由哪個結點擴展過來的,以便找到解決路徑:
class node: # 創建樹節點 def __init__(self, data): self.data = data # 存儲三個壺的容量狀態 self.per = None # 存儲上一時刻三個壺的容量狀態
由于這里只有三個壺,互相傾倒的方案可以枚舉出來,所有我就沒使用二重嵌套循環,而是使用一層循環:
def pour(n): # 擴展子節點 r_list = n.data # 記錄當前三個水壺的容量狀態 max_list = [8, 5, 3] # 水壺的最大容量 for i, j in ((0, 1), (0, 2), (1, 2), (1, 0), (2, 0), (2, 1)): if r_list[i] != 0: n_list = r_list.copy() # 初始化下一結點的水壺狀態 if r_list[i] + r_list[j] > max_list[j]: n_list[i] = r_list[i] - (max_list[j] - r_list[j]) n_list[j] = max_list[j] else: n_list[j] = r_list[i] + r_list[j] n_list[i] = 0 flag = True # 記錄水壺的狀態是否已經發生過(擴展過) for one in closed_list: if one.data == n_list: # 比較當前水壺狀態和以往記錄過得水壺狀態 flag = False if flag: print("擴展的新節點是:",n_list) new_node = node(n_list) # 創建新節點存儲水壺的新狀態 new_node.per = n open_list.append(new_node)
查看當前是否已經擴展到4品脫的水或者是否還有結點可以擴展。
def BFS_node(root_1): # 遞歸查找子節點的擴展狀態以及查驗是否找到4品脫的水壺 n = root_1 print("當前節點:",n.data) if open_list is None: return "沒有找到4品脫的水" nodelist = n.data if 4 in nodelist: print("找到了4品脫的水") print_node(n) return "找到了4品脫的水" closed_list.append(open_list.pop(0)) pour(n) print("*******") BFS_node(open_list[0])
數據初始化,以及找到4品脫水后打印路徑的打印函數。
def print_node(n): # 打印正確的水壺操作路徑 if n.per == None: return "" print(n.data) print_node(n.per) # 初始化數據 root = node([8, 0, 0]) open_list = [root] # 存儲已找到卻未被擴展的子節點 closed_list = [] # 存儲已找到且被擴展的子節點 BFS_node(open_list[0])
關于使用python實現三壺謎題的方法問題的解答就分享到這里了,希望以上內容可以對大家有一定的幫助,如果你還有很多疑惑沒有解開,可以關注億速云行業資訊頻道了解更多相關知識。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。