八數碼問題

2021-07-11 14:12:15 字數 1396 閱讀 5489

八數碼問題

題意:

編號為1~8的8個正方形滑塊被擺成3行3列(有乙個格仔留空),如下圖所示       每次可以把與空格相鄰的滑塊(有公共邊才算相鄰)移到空格中,而他原來的位置   就成為了新的空格。如果無法到達目標局面,則輸出-1

2 6  

4    13 

75  8

移到後:

8    

1    

5     73

642 

樣例輸入:

2 6 4 1 3 7 0 5 8

8 1 5 7 3 6 4 0 2

樣例輸出:

31

【分析】

八數碼很像我們小時候玩的拼圖遊戲,就是把打亂的圖拼成指定形狀。可以

把題看成求最短路徑問題,只是在原來的基礎上增加了不少難度,增加了每的

判斷0的位置,和0的移動,還要儲存每步後的移動結果,判斷重複。陣列不要開

因為資料移動最大可達到9!個(9!=362 880),還要定義長度為9的陣列,

要來儲存移動時的資料情況。

【**】

#include#include#includeusing namespace std;

typedef int state[9]; // 儲存**

const int maxstate = 1000000; // 最大1000000步

state st[maxstate],goal; // 定義goal[9],定義st[maxstate][9]

int dist[maxstate]; // 儲存步數

const int dx=;

const int dy=;

setvis;

void init_lookup_table()

int try_to_insert(int s)

// 廣搜

int bfs()

}front++;

}return 0;

}int main()

八數碼問題

八數碼問題 一.八數碼問題 八數碼問題也稱為九宮問題。在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.狀態表示用整數最快,可是轉化狀態的 不好寫,用字串挺爽的,可有些地方涉及到數字運算,又不自然,整來整去,還是用byte好了.效能沒比字串強多少.2.open錶用linkedlist就挺好,支援佇列和堆疊兩種模型,這點在雙向廣度優先搜尋時候挺方便,closed表千萬別用l...