農夫 狼 羊 白菜(回溯法求解)

2021-06-05 12:53:21 字數 1359 閱讀 5721

為了複試準備,最近做了很多上機題,映象最最深的就是一道關於農夫、狼、羊、白菜的問題。該問題描述如下:有乙個農夫帶乙隻羊、一筐菜和乙隻狼過河.果沒有農夫看管,則狼要吃羊,羊要吃菜.但是船很小,只夠農夫帶一樣東西過河。問農夫該如何解此難題?

開始拿到這題的時候,毫無思路,就一直放在那裡。後來,看《計算機演算法機基礎》回溯法時,直覺可以用它來解決問題。受8-皇后演算法啟發,終於解決了該問題。**如下:

/*

回溯法解決農夫、狼、羊、白菜問題,

其中將農夫每一次過河稱為一次操作

*/#include /*設定經過的最多步驟*/

enum ;

/* 每種操作所對應的文字描述*/

char *chop[8]=;

int isfinal(int istep);

int isfeasible(int istep,int i) ;

int islegal(int *p);

void print(int istep);

/*狀態陣列,最多15步*/

int ans[max_step][4]=;

/*操作記錄陣列,每個步驟所對應的操作*/

int solve[max_step]=;

int main()

則他們過河完成以後其狀態為

*/ for(i=0;i<4;++i) ans[0][i]=1;

while(istep>0)

//若已經完成,則列印結果

else

}else --istep; //遍歷所有的操作皆不可行則回溯到上一步

}//end while

return 0;}/*

根據運算元組solve中的操作記錄

依次顯示操作過程

*/void print(int istep)

printf("succeed\n\n");}/*

檢測是否到達結束狀態

*/int isfinal(int istep)

/* 檢測在第istep步使用操作i是否可行

*/int isfeasible(int istep,int i)

/* 當前狀態不能與之前的狀態相同,

否則陷入無限重複情況

*/ for(j=0;j=4) return 0; //與之前狀態相同

} if(!islegal(chans)) return 0; //檢查chans所對應的狀態是否是合法狀態

else }/*

檢查陣列p所對應的狀態是否合法,

即是否存在狼吃羊或羊吃白菜的情況

*/int islegal(int *p)

關於棧的方法 做狼羊白菜

棧是限定僅在表尾進行插入和刪除操作的線性表。棧 者,儲存貨物或供旅客住宿的地方,可引申為倉庫 中轉站,引入到計算機領域裡,就是指資料暫時儲存的地方,所以才有進棧 出棧的說法。外鏈轉存失敗,源站可能有防盜煉機制,建議將儲存下來直接上傳 img cwdovspo 1572180598700 includ...

題目1204 農夫 羊 菜和狼的故事

題目描述 有乙個農夫帶乙隻羊 一筐菜和乙隻狼過河.果沒有農夫看管,則狼要吃羊,羊要吃菜.但是船很小,只夠農夫帶一樣東西過河。問農夫該如何解此難題?輸入 題目沒有任何輸入。輸出 題目可能有種解決方法,求出步驟最少的解決方法,按順序輸出農夫想把羊 菜 狼全部運過河需要哪幾個步驟。如果需要將羊帶過河去則輸...

第 3 3 課 狼 羊 菜和農夫過河問題

農夫需要把狼 羊 菜和自己運到河對岸去 不知道為啥要運狼,別問我 只有農夫能夠划船,而且船比較小,除農夫之外每次只能運一種東西,還有乙個棘手的問題,就是如果沒有農夫看著,羊會偷吃菜,狼會吃羊。請考慮一種方法,讓農夫能夠安全地安排這些東西和他自己過河。這是乙個很簡單的問題,在狼 羊和菜這個食物鏈上,關...