藍橋杯 歷屆試題 九宮重排(BFS 雜湊)

2022-09-07 18:36:16 字數 1307 閱讀 3352

時間限制: 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 顯然是按從上到下,從左到右的順序記錄數字,空格...