八數碼問題 bfs map

2021-07-11 16:24:54 字數 887 閱讀 7068

八數碼問題也稱為九宮問題。在3×3的棋盤,擺有八個棋子,每個棋子上標有1至8的某一數字,不同棋子上標的數字不相同。棋盤上還有乙個空格,與空格相鄰的棋子可以移到空格中。要求解決的問題是:給出乙個初始狀態和乙個目標狀態,找出一種從初始轉變成目標狀態的移動棋子步數最少的移動步驟。(用0表示空格)

思路:把八數碼問題歸結為圖上的最短路問題。開始狀態對應起點,目標狀態對應終點。用廣搜去搜尋就可以了。

用stl的map來判重。也可以用set來判重。我看其他大神的部落格說用hash表來判重會更快,還有用雙向搜尋來做的,有興趣的可以自己寫寫。

#include #include #include #include #include #include #include #include #include #include #include #include #define ll long long

#define inf 0x7fffffff

#define fin 0x80000000

using namespace std;

typedef int state[9];

state st[500000],gold;

int dist[500000];

mapmp;

int dx=,dy=;

bool ispan(int k)

int bfs()}}

}return -1;

}int main()

/*1 2 3 4 5 6 7 8 0

8 7 6 5 4 3 2 1 0

2 6 4 1 3 7 0 5 8

8 1 5 7 3 6 4 0 2

正確輸出對應是 30、 31

*/

八數碼問題

八數碼問題 一.八數碼問題 八數碼問題也稱為九宮問題。在3 3的棋盤,擺有八個棋子,每個棋子上標有1至8的某一數字,不同棋子上標的數字不相同。棋盤上還有乙個空格,與空格相鄰的棋子可以移到空格中。要求解決的問題是 給出乙個初始狀態和乙個目標狀態,找出一種從初始轉變成目標狀態的移動棋子步數最少的移動步驟...

八數碼問題

2 6 4 1 3 7 0 5 8 8 1 5 7 3 6 4 0 2 樣例輸出 還有就是重判的問題,如何重判呢?第一種方法 把排列變成整數,然後只開乙個一維陣列,也就是說設計一套排列的編碼和解碼函式,把0 8的全排列和0 362879的整數意義一一對應起來。時間效率高,但編碼解碼法適用範圍並不大,...

八數碼問題

八數碼問題 題意 編號為1 8的8個正方形滑塊被擺成3行3列 有乙個格仔留空 如下圖所示 每次可以把與空格相鄰的滑塊 有公共邊才算相鄰 移到空格中,而他原來的位置 就成為了新的空格。如果無法到達目標局面,則輸出 1。2 6 4 13 75 8 移到後 8 1 5 73 642 樣例輸入 2 6 4 ...