參考2:函式物件:關於仿函式、函式物件、ptr_fun
參考3:bind2nd使用
#include
#include
#include
#include
using
namespace
std;
const
int action_count = 8; //一共有8種動作
int dfs_deep = 0;
int result_iter_num = 0; //列印結果時,遍歷的序號
enum state; //物件的位置:此岸,彼岸
/* 動作的代號 */
enum action;
/* 列印結果時,列印的與動作的代號對應的動作全名 */
string actionname[action_count+1] = ;
/* 物件狀態,包含四元組狀態和已執行完的最後乙個動作 */
struct itemstate
itemstate(state f, state w, state s, state v)
bool isfinalstate() //當前動作是否是結束狀態
return
false;
}friend
bool
operator == (const itemstate& is1, const itemstate& is2);
};bool
operator == (const itemstate& is1, const itemstate& is2)
return
false;
}typedef
bool (*processnextfuncptr)(const itemstate& current, itemstate& next);//函式指標
struct actionprocess //動作處理對映結構
;void printresult(const
deque
states)
}/* 去除不合乎要求的狀態,判斷狼、羊不能獨處,羊、菜不能獨處的情況 */
bool iscurrentstatevalid(const itemstate& next)
}if(next.sheep == next.vegetable)
}return
true;
}/* 判斷兩個狀態是否相同 */
bool issameitemstate(itemstate& curitemstate, itemstate& newstate)
return
false;
}/* 避免重複處理狀態,檢查新狀態是否和狀態路徑上已經處理過的狀態有重複 */
bool isprocessedstate(deque
& states, itemstate& newstate)
}return
false;
}/* 處理流程:農夫過河 */
bool processfarmergo(const itemstate& current, itemstate& next)
next = current;
next.farmer = there;
next.curaction = farmer_go;
return
true;
}/* 處理流程:農夫+狼過河 */
bool processfarmergotakewolf(const itemstate& current, itemstate& next)
next = current;
next.farmer = there;
next.wolf = there;
next.curaction = farmer_go_take_wolf;
return
true;
}/* 處理流程:農夫+羊過河 */
bool processfarmergotakesheep(const itemstate& current, itemstate& next)
next = current;
next.farmer = there;
next.sheep = there;
next.curaction = farmer_go_take_sheep;
return
true;
}/* 處理流程:農夫+菜過河 */
bool processfarmergotakevegetable(const itemstate& current, itemstate& next)
next = current;
next.farmer = there;
next.vegetable = there;
next.curaction = farmer_go_take_vegetable;
return
true;
}/* 處理流程:農夫返回 */
bool processfarmerback(const itemstate& current, itemstate& next)
next = current;
next.farmer = here;
next.curaction = farmer_back;
return
true;
}/* 處理流程:農夫+狼返回 */
bool processfarmerbacktakewolf(const itemstate& current, itemstate& next)
next = current;
next.farmer = here;
next.wolf = here;
next.curaction = farmer_back_take_wolf;
return
true;
}/* 處理流程:農夫+羊返回 */
bool processfarmerbacktakesheep(const itemstate& current, itemstate& next)
next = current;
next.farmer = here;
next.sheep = here;
next.curaction = farmer_back_take_sheep;
return
true;
}/* 處理流程:農夫+菜返回 */
bool processfarmerbacktakevegetable(const itemstate& current, itemstate& next)
next = current;
next.farmer = here;
next.vegetable = here;
next.curaction = farmer_back_take_vegetable;
return
true;
}/* 動作處理對映表 */
actionprocess actmap[action_count] =
, ,,,
,,,,
};/* 遞迴,dfs, 窮舉+剪枝,搜尋並列印解 */
void processstate(deque
& states)//執行動作,每次執行有8種選擇
itemstate next = itemstate();
for(int i = 0; i < action_count; ++i)}}
}int main()
bool isprocessedstate_bind(deque
& states, itemstate& newstate)
!注意:issameitemstate函式需要修改引數型別,不可為引用,否則編譯不通過。修改issameitemstate:
/*修改一下引數型別,去掉引用即可,函式體不變*/
bool issameitemstate(itemstate curitemstate, itemstate newstate)
修改遞迴函式:
void processstate(deque
& states)}}
}
兩種實現執行結果是相同的:
C 演算法 狼羊菜過河問題
namespace 狼羊菜過河問題 物件陣列 static string start new string 開始情況 static string end new string 結束情況 static int cnt objects.length 幾種物件 static int count 0 解決方...
用Dijkstra演算法解決狼羊菜渡河問題
乙隻狼,乙隻羊和一筐白菜在河的一岸,乙個擺渡人想把它們都渡到河的另一岸去。但是由於他的船很小,每次只能帶走它們之中的一樣。由於明顯的原因,狼和羊或者羊和白菜在一起需要人看守。問擺渡人怎麼樣把它們渡過河?用四維陣列 a,b,c,d a,b,c,d a,b,c d 表示狼,羊,菜,擺渡人的位置狀態,其中...
演算法謎題系列1 狼羊人問題
有乙個人,乙隻羊,乙隻狼,一捆菜 狼可以吃羊,羊可以吃菜,只有人在的情況,才避免吃的情況 準備過河。有一條船隻能載兩樣東西過河 人也算是一樣東西,只有人才會往返坐船,其它不會 如何過才會全部安全過河 沒有吃的現象 分析 可用自動機方法來解決,乙個狀態可形式化表示為,即people sheep wol...