把初始節點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...