題目:
乙個農夫帶著乙隻狼,乙隻羊和一些菜過河。河邊只有一條船,由於船太小,只能裝下農夫和他的一樣東西。在無人看管的情況下,狼要吃羊,羊要吃菜,請問農夫如何才能使三樣東西平安過河。
演算法的實質:
在滿足一定條件下的,所有狀態的遍歷。
滿足的條件:
1.每次農夫必須移動
2.農夫移動的東西與農夫必須在同一岸,但農夫可不帶東西獨自移動
3.此種狀態,必須在以往從來沒有出現過
基本思路:
以4位二進位制分別表達農夫,狠,菜,羊的狀態,1表示在北岸,0表示在南岸。使用佇列廣度優先遍歷所有狀態,並記下遍歷的可用順序(重複遍歷被除去)
1.佇列**
#pragma once2.農夫過河/** max-1 容量的佇列
*/template
class queue
~queue(void){}
bool full()
return
false;
}bool pushback( data data)
m_data[m_ntail] = data;
m_ntail = (m_ntail+1)%max;
return
true;
}bool empty()
return
false;
}data* getfront()
return null;
}private:
data m_data[max];
int m_nfront;
int m_ntail;
};
1//0表示在南岸,1表示在北岸
2 #include "
string.h"3
//按照 農夫,狼,白菜,羊的順序,排列在乙個int中
4int farmer(int location)5 8
int wolf(int location)
9 12
int cabbage(int location)
13 16
int goat( int location)
17 20
bool safe(int location)
21 25
if(cabbage(location)== goat((location)) && goat(location) != farmer(location))
28return
true;
29 }
30int printresult(int* rout, int len);
31void farmerproblem()
32 58 }
59 }
60if (!b)
61
70 }
71 }
72//
printresult(rout,sizeof(rout)/sizeof(int));
73 }
74int printresult(int* rout, int len)
75 83
else
8687
if(wolf(rout[i]) )
90else
9394
if(cabbage(rout[i]) )
97else
100101
if(goat(rout[i]) )
104else
107108 printf("
\n\n
");109 }
110return
0;111 }
// queue.cpp : 定義控制台應用程式的入口點。
//#include "stdafx.h"
#include "queue.h"
#include #include "farmer.h"
int _tmain(int argc, _tchar* argv)
資料結構與演算法分析 C語言描述
第一種方法,先進行排序,再返回位置k上的元素。簡單排序問題 第二種方法,先將前k個元素讀入,再將剩下的元素逐個讀入,如果新元素大於陣列中第k個元素就找到他合適的位置並將陣列中的乙個元素擠出。第三種方法,利用快排的特點 假設預設公升序排序 每一次快排操作都能確定乙個數在排序結果中的最終固定位置,即該位...
資料結構與演算法分析 c 語言描述
編寫帶有下列宣告的兩個例程 void permute string str void permute char str,int low,int high 第乙個例程是個驅動程式,它呼叫第二個例程並顯示string str中字元的所有排列。例如,str是 abc 那麼輸出的串則是abc,acb,bac...
《資料結構與演算法分析(C 語言描述)》
第1章 uml教程 更多軟體恐怖故事 nist新聞稿 軟體錯誤每年給美國經濟造成595億美元的損失 nist報告本身 pdf 第2章 ieee對實數的反感 c 的按位運算子 第3章 工會 記憶體結構 第5章模式匹配 資料加密 第9章用位集實現集 有關valarrays的更多資訊 第10章 用於解析表...