第 3 3 課 狼 羊 菜和農夫過河問題

2021-10-09 16:31:58 字數 710 閱讀 6539

農夫需要把狼、羊、菜和自己運到河對岸去(不知道為啥要運狼,別問我),只有農夫能夠划船,而且船比較小,除農夫之外每次只能運一種東西,還有乙個棘手的問題,就是如果沒有農夫看著,羊會偷吃菜,狼會吃羊。請考慮一種方法,讓農夫能夠安全地安排這些東西和他自己過河。

這是乙個很簡單的問題,在狼、羊和菜這個食物鏈上,關鍵是中間的羊,因為狼不吃菜,所以要安全過河,農夫的第一件事就是帶羊走,拆開這個食物鏈。但是計算機無法理解這個關鍵的羊,所以我們仍然採用窮舉法來解決這個問題,同時借助於窮舉搜尋找出所有過河的方法。

這個題目的解決思路和「三個水桶倒水」問題的解決思路類似,就是對狀態進行窮舉搜尋,從初始狀態開始窮舉所有的狀態變化,直到某一次變化後得到問題解決的最終狀態,就輸出乙個結果。前面的幾課中已經多次提到窮舉法的兩個關鍵步驟,這裡不再列出。接下來就直接從這兩個步驟入手,介紹如何設計這個問題的窮舉演算法。

定義問題的狀態

在確定以何種方法對解空間進行窮舉搜尋之前,首先要定義問題的解。雖然這個題目的要求是給出農夫帶著他的小夥伴過河的動作,但是單純考慮對動作的窮舉是沒有意義的,因為問題最後的解決狀態是農夫、狼、羊和菜過到河對岸,能最終產生這種狀態的動作才有意義,為了判斷動作的有效性,需要定義乙個合適的狀態來描述這個遊戲在某個時刻的局面。考慮一下這個題目涉及的所有元素:農夫、狼、羊、菜、船和河,河是固定的,沒有狀態變化,因為只有農夫可以划船,所以船可以看作和農夫是一體的,簡化後其實有 4 個元素需要考慮,分別

練習程式 演算法系列14 狼 羊 菜和農夫過河問題

參考2 函式物件 關於仿函式 函式物件 ptr fun 參考3 bind2nd使用 include include include include using namespace std const int action count 8 一共有8種動作 int dfs deep 0 int resu...

C 演算法 狼羊菜過河問題

namespace 狼羊菜過河問題 物件陣列 static string start new string 開始情況 static string end new string 結束情況 static int cnt objects.length 幾種物件 static int count 0 解決方...

狼羊草和農夫過河問題

農夫需要把狼 羊 菜和自己運到河對岸去,只有農夫能夠划船,而且船比較小,除農夫之外每次只能運一種東西,還有乙個棘手的問題,就是如果沒有農夫看著,羊會偷吃菜,狼會吃羊。請考慮一種方法,讓農夫能夠安全地安排這些東西和他自己過河。本題使用深度優先策略構建行動樹,搭配三種剪枝邏輯以保證結果可行 老婆餓了,要...