八數碼問題

2021-08-30 14:07:20 字數 524 閱讀 9619

思路:

從123456780出發,bfs遍歷所有情況,用康拓值編號。

由於水平有限,並未使用逆康拓展開,而是以另乙個陣列儲存了乙個九位數。

bfs:

1.當佇列非空時進行迴圈,直至佇列中無元素。

2.從123456780出發,插旗,移動0.

3.判斷移動後坐標是否越界及visit是否為0。

4.如果滿足條件,計算新陣列康拓值,加入佇列,ans【新康拓】 = ans+1,同時將新陣列轉化為九位數存入b【】。結束之 後插旗。

main:

清空visit【】,將ans【】全部賦值為1(題目要求,不能達到的情況輸出-1);

執行bfs;

計算輸入陣列的康拓值,根據康拓值尋找答案。

注:1.提取新康拓值是的還原不用逆康拓,而是從九位數中還原。如九位數為qaq,則對其迴圈模10除以10,結果存入a【】數 組。

2.交換後的陣列要還原。為0在此處的下一種情況做準備。

3.座標的運算:沒有特殊要求,但是前後必須一致,012或123只能有一種。

八數碼問題

八數碼問題 一.八數碼問題 八數碼問題也稱為九宮問題。在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 ...