洛谷 P1379 八數碼問題

2022-08-01 11:00:12 字數 1598 閱讀 4215

八方塊移動遊戲要求從乙個含 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 。

8 0 3

2 1 4

7 6 5

1 2 3

8 0 4

7 6 5

5

這道題我把圖存成字串,再用map對映步數,還用了九維陣列打標記(笑哭)。剩下的就還是搜尋下去。

1 #include2

#define for(i,a,b) for(int i=a;i<=b;i++)//

巨集定義,很好用

3using

namespace

std;

4string

x,y;

5bool mp[9][9][9][9][9][9][9][9][9];//

6 map sj;//

map對映標記

7 queue q;//

佇列,bfs標配

8int dir[9][4]=;//

九個點上下左右分別的下標(-1代表越界)

9void bfs(string

a)10

//因為初始狀態為1,所以要減一

19for(i,0,a.size()-1)20

23for(i,0,3)24

33} 34}

35 cout<<-1;//

不行就輸出-1 36}

37int

main()

3846

for(i,1,3)47

for(j,1,3)48

53 bfs(x);//

開始搜尋

54return0;

55 }

洛谷 P1379 八數碼難題

在3 3 的棋盤上,擺有八個棋子,每個棋子上標有 1 至 8的某一數字。棋盤中留有乙個空格,空格用 0 來表示。空格周圍的棋子可以移到空格中。要求解的問題是 給出一種初始布局 初始狀態 和目標布局 為了使題目簡單,設目標狀態為 123804765 找到一種最少步驟的移動方法,實現從初始布局到目標布局...

洛谷 P1379 八數碼難題

在3 3的棋盤上,擺有八個棋子,每個棋子上標有1至8的某一數字。棋盤中留有乙個空格,空格用0來表示。空格周圍的棋子可以移到空格中。要求解的問題是 給出一種初始布局 初始狀態 和目標布局 為了使題目簡單,設目標狀態為123804765 找到一種最少步驟的移動方法,實現從初始布局到目標布局的轉變。輸入格...

洛谷 P1379 八數碼難題

洛谷傳送門 jdoj傳送門 在3 3的棋盤上,擺有八個棋子,每個棋子上標有1至8的某一數字。棋盤中留有乙個空格,空格用0來表示。空格周圍的棋子可以移到空格中。要求解的問題是 給出一種初始布局 初始狀態 和目標布局 為了使題目簡單,設目標狀態為123804765 找到一種最少步驟的移動方法,實現從初始...