1. 問題描述
2. 問題分析
3. **分析 參考
農夫過河 (bfs)(佇列)
c++ 用回溯法求解迷宮問題(棧)
農夫帶著白菜,羊,狼希望從河的南岸到達河的北岸,唯一的工具是一條小船,並且只有農夫會划船,一次最多只能帶一樣東西到對岸,請問,農夫要怎麼樣才能帶他的東西過河呢?其中,所攜帶的東西中如果羊和白菜單獨在一起,羊將吃掉白菜;羊和狼單獨在一起,狼將吃掉羊。
1.準備:將每一刻的狀態用0,1表示,比如農夫在南岸為0,在北岸為1。
建立乙個state結構體表示當前農夫、菜、羊、狼分布情況
struct state
;
將這四位狀態在一起變成二進位制,就可以用乙個整數表示
如:
int test1 =8*
(now.loc[0]
)+4*
(now.loc[1]
)+2*
(now.loc[2]
)+1*
(now.loc[3]
);//now表示當前狀態,將狀態轉化為十進位制
好了,現在我們可以表示每次移動後的狀態了,建立乙個route陣列用來記錄移動路徑,因為每一種狀態可以用乙個小於16的數表示
int route[16]
;//儲存路徑,每乙個存從哪過來的
打個比方:當前在起點為 0000,我們知道農夫接下來有四種選擇,寫個函式通過每個選擇是否可行。
比如帶菜過去,接下來的狀態就為1100(12),通過函式safe()判斷,不行進行下乙個
int farmerproblem::
farmer
(state st)
const
int farmerproblem::
cabbage
(state st)
const
int farmerproblem::
sheep
(state st)
const
int farmerproblem::
wolf
(state st)
const
bool farmerproblem::
safe
(state st)
判斷可以帶羊過去,羊過去之後狀態為1010(10)
那麼則有
route[10]
=0;//表示10這個狀態是從0來的
2.結構
利用stack儲存state狀態,若接下來的狀態為真就壓棧。
如果乙個狀態的四種選擇都不行,就把當前狀態出棧,退回到上乙個狀態再討論,這裡我們因為用route記錄是否走過。所以退到上乙個狀態後不用擔心再走一樣的路。
如果可以走通就會沿著乙個方向深入直到沒路退回或者到1111這個狀態(深度優先)。
#include
#include
using
namespace std;
using
namespace std;
//vectorloc(4,0);//int loc[4]; //這裡使用4個整型值標記
struct state
;class
farmerproblem
;//loc中位依次為農夫,白菜,羊,狼。
int farmerproblem::
farmer
(state st)
const
int farmerproblem::
cabbage
(state st)
const
int farmerproblem::
sheep
(state st)
const
int farmerproblem::
wolf
(state st)
const
bool farmerproblem::
safe
(state st)
void farmerproblem::
doit()
st.push
(now)
;//將初始狀態放入棧
route[0]
=0;//標記初始狀態以經過
//int test1 = 0, test2 = 0;//test1表示當前狀態(十進位制),test2表示假設狀態(十進位制)
while
(!st.
empty()
&& route[15]
==-1)
else
//如果是1就過河換為0
int test2 =8*
(c.loc[0]
)+4*
(c.loc[1]
)+2*
(c.loc[2]
)+1*
(c.loc[3]
);//將假設狀態轉化為十進位制if(
safe
(c)&& route[test2]==-
1)//如果假設情況過河後狀態是合法的同時這種狀態還沒有經過(判斷沒有經過可以保證一種狀態只經過一次)}}
if(d ==0)
else
int test2 =8*
(c.loc[0]
)+4*
(c.loc[1]
)+2*
(c.loc[2]
)+1*
(c.loc[3]
);//將假設狀態轉化為十進位制if(
safe
(c)&& route[test2]==-
1)} d++;}
if(d ==4)
}if(route[15]
!=-1)
//如果最終全部都過了河,倒序輸出過河步驟
}void farmerproblem::
display()
const
if(i ==0)
break;}
}int
main()
c實現農夫過河問題
問題描述 乙個農夫帶著乙隻狼 乙隻羊和一棵白菜,身處河的南岸。他要把這些東西全部運到北岸。問題是他面前只有一條小船,船小到只能容下他和一件物品,另外只有農夫能撐船。另外,因為狼能吃羊,而羊愛吃白菜,所以農夫不能留下羊和白菜或者狼和羊單獨在河的一邊,自己離開。請問農夫該採取什麼方案才能將所有的東西運過...
農夫過河問題
題目描述 有乙個農夫帶乙隻羊 一筐菜和乙隻狼過河。如果沒有農夫看管,則狼要吃羊,羊要吃菜。但是船很小,只夠農夫帶一樣東西過河。問農夫該如何解此難題?我的 include include include include include include include using namespace s...
農夫過河問題
問題 有一人帶著狼羊菜來到河的左岸欲乘乙隻小船過到右岸,每次人只能帶其中乙個過河 當有人在不會有事 當無人在時 就不允 許狼和羊在一起,也不允許羊和菜在一起,設計演算法以最少的次數過河?採用位向量,4個二進位制位的0 1情況表示狀態,顯而易見,共24 16種可能狀態。從高位到低位分別表示農夫 狼 白...