農夫過河問題 棧實現 深度優先)

2021-10-25 11:40:40 字數 3075 閱讀 8318

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種可能狀態。從高位到低位分別表示農夫 狼 白...