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