傳教士野人過河問題

2021-09-11 23:25:25 字數 1281 閱讀 5479

這個問題是人工智慧中經典的搜尋問題,下面用深度優先搜尋演算法來解這個題,示例**如下:

#include #include #include using namespace std;

typedef struct

mcnode;

listfringe;//相當於佇列

vectorclosed;//closed表

//判斷是否是目標結點

bool isgoal(mcnode tnode)

//判斷是否是合法狀態

bool islegal(mcnode tnode)

else

return false;

}//過載運算子,判斷兩結構體是否相等

bool operator==(mcnode m1,mcnode m2)

//判斷是否已在closed表中

bool isclosed(mcnode tnode)

if(i==closed.size())

return false;

}void expandnode(mcnode tnode,int b,list&fringe)

else

for(int i=0;i<5;i++)

if(islegal(node[i])&&!isclosed(node[i]))

fringe.push_front(node[i]);//佇列後進先出,深度優先搜尋,最後得到一條最小解序列

// fringe.push_back(node[i]);//佇列後進後出,廣度優先搜尋,最後得到最小解序列狀態空間圖

}void main()

{ mcnode initnode,unode;

initnode.m=3;

initnode.c=3;

initnode.b=1;

fringe.push_back(initnode);//將初始狀態空間加入到佇列

while(!fringe.empty())

{ unode=fringe.front();

fringe.pop_front();

if(isgoal(unode))

{ closed.push_back(unode);

for(int i=0;i!=closed.size();i++)

cout《渡法說明:

2個野人去,1個野人回

2個野人去,1個野人回

2個傳教士去,1個野人與1個傳教士回

2個傳教士去,1個野人回

2個野人去,1個野人回

2個野人去,完成

野人與傳教士過河問題

題目 設有三個 傳教士和3個野人來到河邊,打算乘乙隻船從右岸渡到左岸去。該船的負載能力為兩個人。在任何時候,如果野人人數超過傳教士人數那麼野人就會把傳教士吃掉。他們怎樣才能用這條船安全地把所有人都渡過河去?河岸 a 對岸 b 船上 2c 2y 1c 1y回去 傳教士划船回去 河岸 a 對岸 b 船上...

傳教士與野人過河問題

360公司 2012年校園招聘會筆試題演算法題 傳教士和野人問題 missionaries and cannibals 這是乙個經常在有關討論人工智慧的書籍中見到的問題,其描述是這樣的 有n個傳教士和n個野人來到河邊渡河,河岸有一條船,每次至多可供k人乘渡。問傳教士為了安全起見,應如何規劃擺渡方案,...

傳教士與野人過河問題

360公司 2012年校園招聘會筆試題演算法題 傳教士和野人問題 missionaries and cannibals 這是乙個經常在有關討論人工智慧的書籍中見到的問題,其描述是這樣的 有n個傳教士和n個野人來到河邊渡河,河岸有一條船,每次至多可供k人乘渡。問傳教士為了安全起見,應如何規劃擺渡方案,...