八數碼題解(bfs

2021-10-20 06:42:35 字數 829 閱讀 2618

八數碼分析

本題是求最少交換次數,故先想到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搜尋的每一步就是讓矩陣從乙個狀態變為另乙個狀態。所以我們用...