91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

使用python實現三壺謎題的方法

發布時間:2020-11-03 14:51:03 來源:億速云 閱讀:318 作者:Leah 欄目:開發技術

使用python實現三壺謎題的方法?針對這個問題,這篇文章詳細介紹了相對應的分析和解答,希望可以幫助更多想解決這個問題的小伙伴找到更簡單易行的方法。

一、算法思想

算法分析

  1. 采用的算法思想是將某個時刻水壺中水的數量看作一個狀態,用一個長度為3的數組表示。
  2. 初始狀態便為[8,0,0],再拓展他的下一結點的可能結構。
  3. 若下一結點的結構已經被拓展過了便放棄,若沒有拓展過則加入拓展列表(open_list)中。然后遞歸上述操作。
  4. 直到拓展列表(open_list)為空或者找到目標為止。

思想圖解

這里的第一個數就代表著是那個8品脫的瓶子,依次分別是8品脫,5品脫,3品脫

使用python實現三壺謎題的方法

就如同上圖一樣,使用層次遍歷一次一次遞歸擴展新的結點,知道找到4品脫的水或者無結點可擴展為止(類似于廣度優先遍歷)。

二、代碼展示

1.創建樹節點結構

節點包括兩個屬性,一個屬性是數組類型的,存儲當前三個水壺的容量狀態,另一個屬性是記錄它是由哪個結點擴展過來的,以便找到解決路徑:

class node: # 創建樹節點
  def __init__(self, data):
    self.data = data # 存儲三個壺的容量狀態
    self.per = None # 存儲上一時刻三個壺的容量狀態

2.實現傾倒動作

由于這里只有三個壺,互相傾倒的方案可以枚舉出來,所有我就沒使用二重嵌套循環,而是使用一層循環:

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實現三壺謎題的方法問題的解答就分享到這里了,希望以上內容可以對大家有一定的幫助,如果你還有很多疑惑沒有解開,可以關注億速云行業資訊頻道了解更多相關知識。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

莎车县| 泗阳县| 腾冲县| 尼玛县| 嘉峪关市| 鱼台县| 台中县| 奇台县| 莱西市| 克什克腾旗| 平昌县| 宁武县| 正阳县| 平乐县| 高清| 即墨市| 台州市| 英德市| 资源县| 东方市| 玉山县| 齐河县| 马鞍山市| 佛冈县| 合肥市| 沙河市| 托克托县| 顺义区| 行唐县| 五华县| 江津市| 当阳市| 宝坻区| 临朐县| 鄂托克前旗| 武定县| 方正县| 南召县| 灵武市| 山东省| 祁东县|