時間限制: 1sec 記憶體限制: 128mb 提交: 586 解決: 126思路:題目描述
如下面第乙個圖的九宮格中,放著 1~8 的數字卡片,還有乙個格仔空著。與空格子相鄰的格仔中的卡片可以移動到空格中。經過若干次移動,可以形成第二個圖所示的局面。
我們把第乙個圖的局面記為:12345678.
把第二個圖的局面記為:123.46758
顯然是按從上到下,從左到右的順序記錄數字,空格記為句點。
本題目的任務是已知九宮的初態和終態,求最少經過多少步的移動可以到達。如果無論多少步都無法到達,則輸出-1。
輸入輸入第一行包含九宮的初態,第二行包含九宮的終態。
輸出輸出最少的步數,如果不存在方案,則輸出-1。
樣例輸入
樣例輸出12345678.
123.46758
提示3
把此類問題看成 尋最短路徑問題,相當於空白格相當於起點,然後找到空白格從開始圖的位置到最後目標圖的位置且圖中數字 相同的最小步數。
尋找最小步數 ,可以用bfs來實現,涉及到狀態壓縮 和 查重 這裡我們可以借助乙個map對映
(將字元狀態對映為乙個int型的整數 比如 12345678. ----> 98 別管這個值怎麼來的 反正 每個狀態 可以對映為唯一的乙個整數值)來標記是否這個介面已經被訪問過。或則自己寫乙個雜湊來存狀態。
ac**:
#include#include#include#includeusing namespace std;
char start[4][4],goal[4][4];
int df[4][2] = ,,,};
mapvis;
struct node
;bool check_g(node a)///判斷這個圖和目標圖是否相同
bool check_cf(node a)///判斷這個局面是否出現過
int bfs(int x1,int y1)///bfs尋找最少步數}}
}return -1;
}int main()
for(int i=1;i<=3;i++)
for(int j=1;j<=3;j++)
cin>>goal[i][j];
cout
bfs 藍橋杯 歷屆試題 九宮重排
如下面第乙個圖的九宮格中,放著 1 8 的數字卡片,還有乙個格仔空著。與空格子相鄰的格仔中的卡片可以移動到空格中。經過若干次移動,可以形成第二個圖所示的局面。我們把第乙個圖的局面記為 12345678.把第二個圖的局面記為 123.46758 顯然是按從上到下,從左到右的順序記錄數字,空格記為句點。...
藍橋杯 試題 歷屆試題 九宮重排 BFS 剪枝
問題描述 如下面第乙個圖的九宮格中,放著 1 8 的數字卡片,還有乙個格仔空著。與空格子相鄰的格仔中的卡片可以移動到空格中。經過若干次移動,可以形成第二個圖所示的局面。我們把第乙個圖的局面記為 12345678.把第二個圖的局面記為 123.46758 顯然是按從上到下,從左到右的順序記錄數字,空格...
藍橋杯 歷屆試題 九宮重排
問題描述 如下面第乙個圖的九宮格中,放著 1 8 的數字卡片,還有乙個格仔空著。與空格子相鄰的格仔中的卡片可以移動到空格中。經過若干次移動,可以形成第二個圖所示的局面。我們把第乙個圖的局面記為 12345678.把第二個圖的局面記為 123.46758 顯然是按從上到下,從左到右的順序記錄數字,空格...