使用廣度優先搜尋解決傳教士野人 MC 問題

2021-10-23 06:45:43 字數 3450 閱讀 7485

把初始節點s0放入open表。

如果open表為空,則問題無解,退出。

把open表的第乙個節點(記為節點n)取出放入close表。

考察節點n是否為目標節點。若是,則求得了問題的解,退出。

若節點n不可擴充套件,則轉第2步。

擴充套件節點n,將其子節點放入open表的尾部,並為每乙個子節點都配置指向父節點的指標,然後轉第2步。

#include

#include

#include

using

namespace std;

//定義狀態

class

bank

;bool bank::

operator

==(bank bank1)

else

}class

mc//查詢所有子節點

void

searchsonpoint()

;//判斷節點狀態是否合法

bool

judgepointstate

(bank thisbank)

;//判斷節點是否已生成

bool

judgepointcreated

(bank thisbank,

int& index,

int& who)

;//比較該節點本父節點的代價和新父節點代價,本來小,返回 true,否則false

bool

judgecost

(int index,

int who, bank newfatherbank)

;//判斷是否已完成任務

bool

judgeachievement

(bank thisbank2)

;//改變所有該節點的子節點的值

void

changesonpointcost

(int index)

;//尋找該屬性的索引值

intfoundindex

(bank thisbank)

;//返回乙個路徑點集合

vector

returnresult()

;//列印列表

void

output()

;};void mc::

output()

else

else

} cout <<

"右岸"

<< endl;

cout <<

"修道士:"

<< missionarynum - result.

at(i)

.missionarynum <<

"人 野人:"

<< cannibalsnum - result.

at(i)

.cannibalsnum <<

"人"<< endl << endl;}}

}vector mc::

returnresult()

else

}return result;

}void mc::

changesonpointcost

(int index)

}for

(int i =

0; i < banksclose.

size()

; i++)}

}int mc::

foundindex

(bank thisbank)

return fatherpoint;

}void mc::

searchsonpoint()

banksopen.

erase

(begin

(banksopen));

banksclose.

push_back

(thisbank)

;//將根節點轉移到close表

for(

int i =

0; i < boatmovesize; i++

)else

elseif(

judgepointstate

(sonbank)

)int index, who;

//如果建立了if(

judgepointcreated

(sonbank,index,who)

)else

//在close裡

else}}

//如果沒建立,放在陣列後面

else}}

}}h: cout <<

"完成查詢"

<< endl;

}//判斷是否違規

bool mc::

judgepointstate

(bank thisbank)

else

}//index是下標,who是那個表

bool mc::

judgepointcreated

(bank thisbank,

int& index,

int& who)

}for

(int i =

0; i < banksclose.

size()

; i++)}

return

false;}

bool mc::

judgecost

(int index,

int who, bank newfatherbank)

else

}else

else}}

bool mc::

judgeachievement

(bank thisbank2)

else

//cout << "判斷最終節點完成" << endl;

}mc::mc(

int m,

int c,

int b)}}

for(

int i =

0; i <= b; i++)}

}//cout << boatmovesize << endl;

//初始化open表,初始狀態為n,n,1

bank elem;

elem.boatinhere =1;

elem.fatherpoint =-1

; elem.cannibalsnum = cannibalsnum;

elem.missionarynum = missionarynum;

elem.ordernumber =0;

succespath = elem;

beginpath = elem;

banksopen.

push_back

(elem)

;//初始化close表 ,初始為0

//cout << "初始化完成" << endl;

}int

main()

野人傳教士問題 盲目搜尋

從前有一條河,河的左岸有 m個傳教士 missionary 和m 個野人 cannibal 和一艘最多可乘 n人的小船。約定左岸,右岸和船上或者沒有傳教士,或者野人數量少於傳教士,否則野人會把傳教士吃掉。程式設計,接收m和 n,搜尋一條可讓所有的野人和傳教士安全渡到右岸的方案。我們先假設左岸有 3個...

深度優先搜尋 廣度優先搜尋(解決小哈)

問題省略 思路 讓小哼往右邊走,直到走不通的時候再回到這裡,再去嘗試另乙個方向。規定乙個順序,按順時針方向來嘗試 即按照右 下 左 上的順序去嘗試 先 檢查小哼是否已經到達小哈的位置,如果沒有到達則找出下一步可以走的地方。為了解決這個問題,此處dfs 函式只需要維護3個引數,分別是x座標 y座標 以...

廣度優先搜尋解決八數碼問題

程式描述 基於盲目搜尋策略的寬度優先搜尋方法 include include include include include include include using namespace std define n 9 九宮格總數字 陣列定義 0 9階乘定義 const int jc n 1 0 9...