農夫過河 資料結構實驗報告

2021-08-10 08:19:24 字數 2424 閱讀 2557

資料結構實驗報告

實驗名稱:實驗三 農夫過河

學號:***

姓名:gnosed

實驗日期:2017.10.30

一、實驗目的

1、進一步掌握佇列的使用

2、會使用佇列進行農夫過河解的搜尋

二、實驗具體內容

1、實驗題目1:

(1)題目

經典的農夫過河問題

乙個農夫帶著乙隻狼,乙隻羊和一顆白菜過河,從西岸到東岸。船太小,他每次過河只能攜帶一樣東西,船隻有農夫能撐。問題是狼會吃羊,羊會吃白菜,所以不能單獨讓狼和羊或者羊和白菜單獨在河的一邊,但狼不吃白菜。請問農夫採取什麼方案,才能將所有東西安全運過河?

要求:使用廣度優先搜尋農夫過河解,並輸出結果。

(2)分析

首先對每件東西的位置進行描述,用4位二進位制數順序分別表示農夫、狼、羊和白菜的位置,0表示在東西河的西岸,1表示在東岸。例如1001表示農夫和白菜在東岸,狼和羊在西岸。

資料結構:

1.     int location:用整型location表示位置狀態,從初始化狀態0(二進位制為0000)到終結狀態15(二進位制為1111)。

2.     queuemoves:用整型佇列moves儲存每一步所有可能達到的狀態,佇列每個元素表示乙個安全的狀態。按照佇列先進先出的原則,只有在前一步的所有狀態都處理完後,才開始處理後一步的各狀態。

3.     int route[16]:陣列route有16種狀態(0000~1111),用來記錄已經被訪問的各個狀態,以及達到這些狀態的前驅狀態。做法是初始化元素值為-1,當往佇列move入隊一種安全狀態時,將 以這個狀態值作為下標的陣列元素值(-1)改為達到這個狀態的前驅狀態的下標值。因此,當模擬完成時,利用route陣列元素的值生成乙個正確的狀態路徑。

狀態判斷

1.     個體位置:根據 按位與&運算的性質,可使location與乙個十六進製制數相與,計算結果用來取某東西當前的位置。例如location & 0x08 ,結果為1表示農夫在西岸,否則在東岸。狼羊白菜的這個十六進製制數分別為 0x04,0x02,0x01。

2.     安全:由四個東西的位置關係,判斷該狀態是否安全。不安全的狀態只有兩種,狼和羊,或者羊和白菜單獨在河一側。

狀態翻**

要從一種安全狀態轉換到另一種狀態(過河),首先考慮各種物品的移動(通過左移《運算),對於某些物品和農夫在同一側的狀態,就翻轉狀態判斷其是否安全。因為農夫都必須改變狀態,所以只有農夫被移動的東西(movers所表示)在同一岸時,農夫才可能將它帶走。當然可以什麼都不帶,農夫可以直接過河。首先將movers和二進位制0x00進行 按位或運算,確定需要翻轉的位,再將這個結果與原來的狀態location進行 異或運算,從而實現翻轉,得到乙個新的狀態newlocation。具體細節看code。

模擬過程:

首先使初始狀態0x00入隊。

1)當佇列不空且route[15]==-1(未被訪問)時,取隊頭的狀態location(出隊),否則如果route[15]已被訪問,輸出方案,否則沒有方案。

2)對於每個物品,判斷其是否與農夫在河一側,如全部物品都已判斷,返回1)。

3)若是,則翻轉當前狀態location得到新的狀態newlocation。

4)若newlocation安全而且新狀態route[newlocation]沒有被訪問,將新狀態入隊,並記錄新狀態的前驅。返回2)。

(3)實驗**

源**:

#include #include using namespace std;

//判斷各物品的位置

int famer(int location)

int wolf(int location)

int goat(int location)

int cabbage(int location)

//判斷狀態安全

int safe(int location)

void farmerproblem()}}

}if(route[15]!=-1){//到達最終狀態

cout<<"path:\n";

for(int i=15;i>=0;i=route[i]){

cout《測試結果:

path:

15 5 13 1 11 2 10 0

三、實驗小結

1.        實驗中乙個巧妙的方法是用位數來模擬物品的位置以及位置的處理,這涉及到位運算,自己重新總結了一下。

2.        對bfs有更深一步理解,基本掌握佇列的使用。

資料結構實驗報告 資料結構實驗報告

使用c語言中的陣列,實現線性表中的順序結構儲存的查詢 刪除操作。1 初始線性表通過陣列 迴圈 scanf語句實現輸入任意個整數。2 刪除操作的實現,任意輸入乙個要刪除的整數,找到這個元素,將此元素之後的所有元素逐個前移一位,實現刪除操作。3 要求以上2步操作可以重複執行。4 例如 刪除操作執行結果大...

資料結構實驗報告

1 掌握佇列儲存結構的表示和實現方法。2 掌握佇列的入隊和出隊等基本操作的演算法實現。3 了解佇列在解決實際問題中的簡單應用。1 建立順序迴圈佇列,並在順序迴圈佇列上實現入隊 出隊基本操作 驗證性內容 2 建立迴圈鏈佇列,並在迴圈鏈佇列上實現入隊 出隊基本操作 設計性內容 3 實現鍵盤輸入迴圈緩衝區...

資料結構實驗報告

1 理解二叉樹的型別定義與性質。2 掌握二叉樹的二叉鍊錶儲存結構的表示和實現方法。3 掌握二叉樹遍歷操作的演算法實現。4 熟悉二叉樹遍歷操作的應用。1 建立二叉樹的二叉鍊錶儲存結構。2 實現二叉樹的先序 中序和後序三種遍歷操作 驗證性內容 3 應用二叉樹的遍歷操作來實現判斷兩棵二叉樹是否相等的操作 ...