練習程式 演算法系列14 狼 羊 菜和農夫過河問題

2021-07-09 17:18:39 字數 4260 閱讀 8674

參考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...