農夫過河 BFS 佇列

2022-08-24 01:45:09 字數 1995 閱讀 9827

1 、問題描述

要求設計實現農夫過河問題(農夫帶著乙隻狼,乙隻養,一棵白菜,一次只能帶乙個東西)如何安全過河。

2 、問題的解決方案:

可以用棧與佇列、深度優先搜尋演算法及廣度優先搜尋演算法相應的原理去解決問題。

1)   實現四個過河物件(農夫、白菜、羊和狼)的狀態,可以用乙個四位二進位制數來表示,0表示未過河,1表示已經過河了。

2)   過河的物件必須與農夫在河的同一側,可以設計函式來判斷。

3)   防止狀態往復,即農夫將乙個東西帶過去又帶回來的情況發生,需將所有可能的狀態進行標定。

4)   可用深度優先搜尋演算法及廣度優先搜尋演算法去解題。

分析:對於這道課程設計題我一開始並沒有思路,在網上搜尋了很多的方法,發現廣度優先搜尋相對好一些。運用的是位運算方法,位運算的方法在程式中的確運算方便且速度快,但不便於我們去理解,我們可以直接在定義成乙個字串進行操作物件狀態,這樣子相對好理解一些。

(1)初始化

過河狀態按照題目的二進位制數規定即可,我在這裡規定0000中第乙個0代表農夫的狀態、第二個0代表狼的狀態、第三個0代表羊的狀態、最後乙個0代表白菜的狀態,由於01組成的二進位制數過河狀態一共有16中情況,定義乙個route[16]的陣列,用於標記已經走過的狀態,順便將標記值定義為前驅狀態便於查詢,初始化route陣列為-1(都沒有經過),先把四個物件都沒過河的情況(0000)放入佇列,同時標記route[0]為0 (0狀態沒有前驅)表示已經經過。

(2)搜尋

(3)輸出步驟

route詳細記錄了每個狀態的前驅,我們從route[15]對應值找前驅,再從前驅找其對應前驅,直到找到route[0]為止。這樣的話就倒序輸出了農夫過河的最佳路徑

實現**

1 #include

2 #include3 #include4 #include5 #include6

using

namespace

std;

7 queuest;//

定義乙個佇列用來存放合法狀態

8string a="

0000";

9string

b,c;

10int route[16

],temp,l,r;

11//

0代表農夫 1代表狼 2代表羊 3代表菜

12bool check(char a1 ,char b1,char c1,char d1)//

定義函式來檢測合法狀態

1328

intbfs()

2950

else

//如果是1就過河換為0

5155 test2=8*(c[0]-'

0')+4*(c[1]-'

0')+2*(c[2]-'

0')+1*(c[3]-'

0');//

將假設狀態轉化為十進位制

56if(check(c[0],c[1],c[2],c[3])&&route[test2]==-1)//

如果假設情況過河後狀態是合法的同時這種狀態還沒有經過

5761}62

}63 c=b;//

這種情況是考慮農夫不帶任何東西過河,與上面判斷情況相同

64if(c[0]=='0'

)6568else

6972 test2=8*(c[0]-'

0')+4*(c[1]-'

0')+2*(c[2]-'

0')+1*(c[3]-'0'

);73

if(check(c[0],c[1],c[2],c[3])&&route[test2]==-1)74

78}79if(route[15]!=-1)//

如果最終全部都過了河,倒序輸出過河步驟

80105

if(i==0

)106

break

;107

}108

}109

}110

intmain()

111

農夫過河問題

題目描述 有乙個農夫帶乙隻羊 一筐菜和乙隻狼過河。如果沒有農夫看管,則狼要吃羊,羊要吃菜。但是船很小,只夠農夫帶一樣東西過河。問農夫該如何解此難題?我的 include include include include include include include using namespace s...

農夫過河問題

問題 有一人帶著狼羊菜來到河的左岸欲乘乙隻小船過到右岸,每次人只能帶其中乙個過河 當有人在不會有事 當無人在時 就不允 許狼和羊在一起,也不允許羊和菜在一起,設計演算法以最少的次數過河?採用位向量,4個二進位制位的0 1情況表示狀態,顯而易見,共24 16種可能狀態。從高位到低位分別表示農夫 狼 白...

求解農夫過河問題

問題 乙個農夫帶著一匹狼 乙隻羊 一顆白菜要過河,只有一條船而且農夫每次最多只能帶乙個動物或物品過河,並且當農夫不在的時候狼會吃羊,羊會吃白菜,列出所有安全將所有動物和物品帶過河的方案。思路分析 顯然這不是乙個最優解的問題,最容易想到的方法就是遍歷了,設法用遍歷列舉出所有可能出現的情況,根據條件選取...