八數碼分析
本題是求最少交換次數,故先想到bfs,而本題的難點在於狀態和步數的儲存。以及狀態的轉移。
如何記錄下x和乙個數交換後的狀態?
如何記錄步數?
主要思想
乙個巧妙的思想可以解決此類問題,狀態可以用string型別來記錄,求在3*3矩陣中的橫縱座標無非就是將其在string型別中的位序(假設為k)x=k/3,y=k%3。而查詢起來也異常方便 直接用find函式即可找到(string型別作為stl的優勢),而它的交換次數可用雜湊來儲存 即可定義unordered型別,這樣就將其狀態和步數都儲存了下來。
示例**
#include#include#include#includeusing namespace std;
queueq;
unordered_mapd; //雜湊表儲存交換次數
int dx=;
int dy=;
string start;
void read()
int bfs()
swap(t[k],t[a*3+b]);}}
}return -1; //如果最後未發現則返回-1
} int main()
八數碼 bfs,雜湊
很經典的搜尋,bfs部分沒什麼好講的,不是很難,值得注意的是如何判定走的路徑是否重複,本題採用的是雜湊來判重 include include includetypedef int state 9 const int maxn 1000003 int head maxn next maxn head陣...
雙向BFS 八數碼問題
問題描述 在3 3的棋盤上,擺有八個棋子,每個棋子上標有1至8的某一數字。棋盤中留有乙個空格,空格用0來表示。空格周圍的棋子可以移到空格中。要求解的問題是 給出一種初始布局 初始狀態 和目標布局 目標狀態 找到一種最少步驟的移動方法,實現從初始布局到目標布局的轉變。例如 2 8 3 1 6 4 7 ...
BFS入門 八數碼問題
題目描述 初始狀態的步數就算1,哈哈 輸入 第乙個33的矩陣是原始狀態,第二個33的矩陣是目標狀態。輸出 移動所用最少的步數 input 2 8 3 1 6 4 7 0 5 1 2 3 8 0 4 7 6 5 output 思路 這道題bfs搜尋的每一步就是讓矩陣從乙個狀態變為另乙個狀態。所以我們用...