八碼數問題

2021-06-21 14:13:52 字數 1540 閱讀 9192

編號為1~8的8個正方形滑塊被擺成 3 行3列(有乙個空格留空),每次可以把與空格相鄰的滑塊(有公共邊才算相鄰)移到空格中,而它原來的位置就成為了新的空格。給定初始局面和目標局面(用0 表示空格),需要你幫忙計算出最少的移動步數。如果無法達到目標局面,就輸出「 -1 」。26

4137

58 8

1573

642

樣例輸入:

2 6 4 1 3 7 0 5 8

8 1 5 7 3 6 4 0 2

樣例輸出: 31

**:

#include#include#includetypedef int state[9];//定義「狀態」型別

const int max = 1000000;

state st[max], goal;//狀態陣列,儲存所有狀態.

int dist[max];//距離陣列.

const int dx = ;

const int dy = ;

const int maxn = 1000003;

int head[maxn],next[maxn];

int vis[3628800],fact[9];

void init_lookup_table()

int try_to_insert(int s)//通過」code「把排列變成整數

if(vis[code])

return 0;

return vis[code] = 1;

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

int bfs()

}front++;//擴充套件完畢後再修改隊首指標。

} return 0;

}int main()

思路解析:

八數碼問題歸根到底就是圖上的最短路問題,其中每個狀態就是9個格仔中的滑塊編碼(從上到下,從左到右地把它們放在乙個包含9個元素的陣列中)。

**中的memcmp()函式和memcpy()函式,用來進行整塊記憶體的比較和複製,比用迴圈比較和迴圈賦值效率要高。

**中的init_lookup_table()和try_to_insert(rear),作用是進行bfs中 的判斷是否重複。把"0~8"的全排列和0~362879的整數一一對應起來,只開乙個一維的陣列即可。

也可以使用雜湊函式,把結點「變成」整數,但不必是一一對應,就是構造雜湊函式h(x),然後把任意結點x對映到某個給定的範圍[ 0,m-1]的整數即可。注意不同結點的雜湊值也有相同的,此時需要開乙個大小為m的陣列。把雜湊值相同的狀態組織成煉表。。。

**:

const int maxn = 1000003;

int head[maxn],next[maxn];

void init_lookup_table()

int hash(state & s)

int try_to_insert(int s)

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

head[h] = s;

return 1;

}

八面碼問題 BFS Hash

include include include include include include include include includeusing namespace std typedef int state 9 const int maxn 1000000 state st maxn go...

八卦與ASCII碼

嘗試用伏羲八卦與計算機ascii 建立聯絡 坤0 震1 坎2 兌3 艮4 離5 巽6 幹7,採用二的n次方表示。美國資訊交換標準碼 ascii american standard code for information interchange 起始於50年代後期,最後完成於1967年。ascii字...

Eight八位數問題2

通過程式的多次執行計算,發現此題可能有多個解!例如 2 3 4 1 5 x 7 6 8 發現有以下三個解都符合要求 ullddrurdllurrdlurd dlurullddrurdllurdr ullddrurdllurdruldr 所以大家在做的時候要注意,不一定是你的 有問題,而是問題描述時沒...