題解 八數碼問題

2021-09-20 18:47:27 字數 1581 閱讀 6868

八數碼問題描述

八方塊移動遊戲要求從乙個含 8 個數字(用 1-8 表示)的方塊以及乙個空格方塊(用 0 表示)的 3 × 3 矩陣的起始狀態開始,不斷移動該空格方塊以使其和相鄰的方塊互換,直至達到所定義的目標狀態。空格方塊在中間位置時有上、下、左、右 4 個方向可移動,在四個角落上有 2個方向可移動,在其他位置上有 3 個方向可移動。例如,假設乙個 3× 3 矩陣的初始狀態為:

8 0 3

2 1 4

7 6 5

目標狀態為:

1 2 3

8 0 4

7 6 5

則乙個合法的移動路徑為:

8 0 3 > 8 1 3 > 8 1 3 > 0 1 3 > 1 0 3 > 1 2 3

2 1 4 > 2 0 4 > 0 2 4 > 8 2 4 > 8 2 4 > 8 0 4

7 6 5 > 7 6 5 > 7 6 5 > 7 6 5 > 7 6 5 > 7 6 5

另外,在所有可能的從初始狀態到目標狀態的移動路徑中,步數最少的路徑被稱為最短路徑;在上面的例子中,最短路徑為 5 。如果不存在從初試狀態到目標狀態的任何路徑,則稱該組狀態無解。 請設計有效的(細節請見評分規則)演算法找到從八方塊的某初試狀態到某目標狀態的所有可能路徑中的最短路徑。

輸入程式需讀入初始狀態和目標狀態,這兩個狀態都由 9 個數字組成( 0 表示空格, 1-8 表示 8個數字方塊),每行 3 個數字,數字之間用空格隔開。

輸出如果輸入資料有解,輸出乙個表示最短路徑的非負的整數;如果輸入資料無解,輸出 -1 。

輸入樣例 1

8 0 3

2 1 4

7 6 5

1 2 3

8 0 4

7 6 5

輸出樣例 1

對八數碼這個東西的理解,以及對這個問題的嘗試。

主要對廣度優先搜尋/深度優先搜尋的理解與運用。

對於**量大的難題,細節是最重要的。

對只是的靈活運用及他的解法,找出其中的規律。

這道題最好畫乙個圖,否則就不很好理解。

|803-813-013-103-123

|214-204-024-824-804

|765-765-765-765-765

|————運動過程

1.將執行前的初始狀態,用來求表示最短路的過程。

2.用執行後的目標狀態,來求值。

最後,就不多說,建議去玩玩這個遊戲

ac**:

#include using namespace std;

struct node,,,};

bool in(int x, int y)

int bfs()

if(st.count(nxt) == 0) }}

}return -1;

}int main()

} }for(int i=0;i<3;i++)

} cout

}

八數碼題解(bfs

八數碼分析 本題是求最少交換次數,故先想到bfs,而本題的難點在於狀態和步數的儲存。以及狀態的轉移。如何記錄下x和乙個數交換後的狀態?如何記錄步數?主要思想 乙個巧妙的思想可以解決此類問題,狀態可以用string型別來記錄,求在3 3矩陣中的橫縱座標無非就是將其在string型別中的位序 假設為k ...

題解 八數碼問題 (雜湊表 搜尋)

題意 3 3九宮棋盤,放置數碼為1 8的8個棋牌,剩下乙個空格,只能通過棋牌向空格的移動來改變棋盤的布局。給出初始布局和目標布局,問最少多少步移動能夠使初始布局變為目標布局 分析 題目思路很清晰,直接廣搜即可。但是問題是如何儲存狀態並且判重?我們對於每乙個狀態進行觀察,均是由0 8構成的乙個全排列,...

八數碼問題

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