為了複試準備,最近做了很多上機題,映象最最深的就是一道關於農夫、狼、羊、白菜的問題。該問題描述如下:有乙個農夫帶乙隻羊、一筐菜和乙隻狼過河.果沒有農夫看管,則狼要吃羊,羊要吃菜.但是船很小,只夠農夫帶一樣東西過河。問農夫該如何解此難題?
開始拿到這題的時候,毫無思路,就一直放在那裡。後來,看《計算機演算法機基礎》回溯法時,直覺可以用它來解決問題。受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 課 狼 羊 菜和農夫過河問題
農夫需要把狼 羊 菜和自己運到河對岸去 不知道為啥要運狼,別問我 只有農夫能夠划船,而且船比較小,除農夫之外每次只能運一種東西,還有乙個棘手的問題,就是如果沒有農夫看著,羊會偷吃菜,狼會吃羊。請考慮一種方法,讓農夫能夠安全地安排這些東西和他自己過河。這是乙個很簡單的問題,在狼 羊和菜這個食物鏈上,關...