python實現三壺謎題的示例詳解

2022-10-04 13:30:28 字數 2094 閱讀 6797

有乙個充滿水的8品脫的水壺和兩個空水壺(容積分別是5品脫和3品脫)。通過將水壺完全倒滿水和將水壺的水完全倒空這兩程式設計客棧種方式,在其中的乙個水壺中得到4品脫的水。

這裡的第乙個數就代表著是那個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)

nevksglznbw_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 nodeli

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] # 儲存已找到卻未www.cppcns.com被擴充套件的子節點

closed_list = # 儲存已找到且被擴充套件的子節點

bfs_node(open_list[0])

主要是用廣度優先遍歷的思想和樹結構,當然如果不在意找到4品脫的水的路徑,其實沒必要使用樹結構。另外列印函式是從最後一層依次往上回溯的,所以顯示的是倒序的路徑。如果需要變成正向的話,可以加乙個棧來實現。

Python 實現陣列相減示例

問題描述 有2個陣列如下 a 3,3,3,4,4,4,5,6,7 b 3,3,4,4 第1題 從陣列a中刪除所有在陣列b 現過的元素。對於上例來說,a刪除結束應該等於 5,6,7 第2題 實現 c a b c應該等於 3,4,5,6,7 先看第1題 常規的思維大致會這麼寫 for i in a if...

使用Python實現Hive的UDF示例

主要分為兩個部分,乙個部分為python指令碼實現想要實現的功能,另外乙個部分為hql部分,呼叫python指令碼對資料進行處理。hql呼叫python實現的udf其實有乙個重定向的過程,把資料表中之列的列重定向python的標準輸入中,按行操作,首先將每行按照指定的分割符分開,一般為 t 然後剩下...

Python實現貪心演算法的示例

今天乙個研究生同學問我乙個問題,問題如下 超市有m個顧客要結賬,每個顧客結賬的時間為ti i取值從1到m 超市有n個結賬出口,請問全部顧客怎麼選擇出口,可以最早完成全部顧客的結賬,並用 實現。其實利用的就是貪心演算法來解決這個問題,那麼,什麼是貪心演算法?怎麼用貪心演算法解決這個問題?讓我一一道來。...