程式設計開發九宮重排 (搜尋)問題解析

2021-12-30 03:46:54 字數 1369 閱讀 4495

問題描述:在九宮格中放置8個數,有乙個為空格。給定初始狀態九宮格,和目標狀態九宮格,問需要多少步可以將初始狀態變成目標狀態。如果無法達到輸出-1,如果可以達到,輸出最少的步驟數。

問題分析:本題屬於搜尋演算法中的經典題目。可以用很多方法來解答,一般有a*演算法和廣度搜尋bfs。因為廣度搜尋較容易理解,所以這裡就用bfs來解答。

已知乙個初始狀態,如何利用bfs,搜尋到最終狀態?

如下圖所示,每一次畫出當前可移動之後的狀態,每次移動乙個方塊,層數表示移動的步驟數,一旦搜尋到目標狀態,就停止搜尋返回層數,即最少的步驟數。

這裡有幾個問題需要注意:

1.如何進行重複性判斷? 一旦搜尋到重複的狀態圖,表示前面已經搜尋到過了,所以重複的就不需要考慮了。我是通過set集合,將每個圖對映成乙個整數,將其壓入set集合中,當下次來乙個新的整數,只要判斷它是否在set集合中即可。

2.如何儲存圖的狀態?用乙個結構體node,裡面儲存乙個char[3][3]陣列和空格的位置。

3.如何表示空格周圍方塊的移動?其實只要更新空格的位置,再將空格位置上的原值移動到原來空格的位置即可。簡而言之,就是交換兩個數值的位置,只不過這裡有乙個值是'.'

4.另外注意,移動之後數碼塊的合法性檢查,即是否超出了邊界。

**展示:

#include

#include

#include

#include

using namespace std;

#define n 10005;

char mp[3][3],gp[3][3];

int dir[4][2] = ; //表示上下左右四個方向

struct node

};set st;

queue q;

bool check(node cur)

}return true;

}int cal(node cur)

}return result;

}void bfs()

}cout<>str1>>str2;

int bx=0,by=0;

while(!q.empty())

q.pop();

int len = 0;

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

node cur = node(bx,by,0);

memcpy(cur.cur_mp,mp,sizeof(mp));

q.push(cur);

len = 0;

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

}bfs();

return 0;

}

BFS解決九宮重排問題

問題 1426 藍橋杯 歷屆試題 九宮重排 時間限制 1sec 記憶體限制 128mb 提交 215 解決 47 題目描述 如下面第乙個圖的九宮格中,放著 1 8 的數字卡片,還有乙個格仔空著。與空格子相鄰的格仔中的卡片可以移動到空格中。經過若干次移動,可以形成第二個圖所示的局面。我們把第乙個圖的局...

BFS解決九宮重排問題

問題 1426 藍橋杯 歷屆試題 九宮重排 時間限制 1sec 記憶體限制 128mb 提交 215 解決 47 題目描述 如下面第乙個圖的九宮格中,放著 1 8 的數字卡片,還有乙個格仔空著。與空格子相鄰的格仔中的卡片可以移動到空格中。經過若干次移動,可以形成第二個圖所示的局面。我們把第乙個圖的局...

BFS解決九宮重排問題

問題 1426 藍橋杯 歷屆試題 九宮重排 時間限制 1sec 記憶體限制 128mb 提交 215 解決 47 題目描述 如下面第乙個圖的九宮格中,放著 1 8 的數字卡片,還有乙個格仔空著。與空格子相鄰的格仔中的卡片可以移動到空格中。經過若干次移動,可以形成第二個圖所示的局面。我們把第乙個圖的局...