八數碼問題

2021-07-02 02:43:31 字數 1390 閱讀 7845

2 6 4 1 3 7 0 5 8

8 1 5 7 3 6 4 0 2

樣例輸出:

還有就是重判的問題,如何重判呢?

第一種方法:把排列變成整數,然後只開乙個一維陣列,也就是說設計一套排列的編碼和解碼函式,把0~8的全排列和0~362879的整數意義一一對應起來。

時間效率高,但編碼解碼法適用範圍並不大,如果隱士圖總結點非常大,陣列還是開不下。

int vis[362880], fact[9];

void init_lookup_table()

int try_to_insert(int s)

int hash(state& s)

int try_to_insert(int s)

next[s]=head[h];///插入鍊錶

head[h] = s;

return 1;

}

需要注意:雜湊表中對效率起作用的是雜湊函式。

第三種:stl集合。

setvis;

void init_lookup_table()

int try_to_insert(int s)

下面貼上全部**:

#include#include#include#include#includeusing namespace std;

typedef int state[9];

///定義狀態型別

const int maxstate=1000000;

state st[maxstate], goal;

///狀態陣列,所有狀態都儲存在這裡

int dist[maxstate];///距離陣列

///如果需要列印方案,可以在這裡加乙個「父親編號」陣列

///int fa[maxstate]

const int dx=;

const int dy=;

///bfs,返回目標狀態在st陣列下標

///為了防止重判,但又不能開9維陣列9的9次方是387420489

///第一種方法:把排列程式設計整數,只開乙個一維陣列,設計一套編碼解碼

///把0~8的全排列和0~362879的整數一一對應

///第一種方法:編碼解碼法

//int vis[362880], fact[9];

//void init_lookup_table()

////int try_to_insert(int s)

int try_to_insert(int s)

int bfs()

}front++;

}return 0;

}int main()

八數碼問題

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

八數碼問題

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

八數碼問題

搜尋演算法學問不小.總結 1.狀態表示用整數最快,可是轉化狀態的 不好寫,用字串挺爽的,可有些地方涉及到數字運算,又不自然,整來整去,還是用byte好了.效能沒比字串強多少.2.open錶用linkedlist就挺好,支援佇列和堆疊兩種模型,這點在雙向廣度優先搜尋時候挺方便,closed表千萬別用l...