bfs 藍橋杯 歷屆試題 九宮重排

2021-09-11 18:46:47 字數 1646 閱讀 7598

如下面第乙個圖的九宮格中,放著 1~8 的數字卡片,還有乙個格仔空著。與空格子相鄰的格仔中的卡片可以移動到空格中。經過若干次移動,可以形成第二個圖所示的局面。

我們把第乙個圖的局面記為:12345678.

把第二個圖的局面記為:123.46758

顯然是按從上到下,從左到右的順序記錄數字,空格記為句點。

本題目的任務是已知九宮的初態和終態,求最少經過多少步的移動可以到達。如果無論多少步都無法到達,則輸出-1。

輸入輸入第一行包含九宮的初態,第二行包含九宮的終態。

輸出輸出最少的步數,如果不存在方案,則輸出-1。

樣例輸入

12345678.

123.46758

樣例輸出

3題解:

實現bfs主要有兩部分:標記狀態,維護佇列。

1.標記狀態。這一題,狀態是乙個9宮格,我們標記圖的狀態的方法有hash,康拓展開式等等。這裡我們利用unordered_map(hash表) 的方法來標記圖的狀態,只不過在此之前,我們需要把這樣的乙個圖變成字串。

2.維護佇列。這裡我們需要同時記錄圖的字串和已經移動了多少步數,所以我們利用make_pair()來將string和step一起放到佇列中去。

同時我們也總結乙個bfs的模版

bool visit[n];

void bfs(int begin)

for(int i = 1; i < n; i++)}}

**如下

#include#include#include#includeusing namespace std;

unordered_maphash; //hash標記 放在全域性變數 初始為false

int dx[4] = ;

int dy[4] = ;

string to_string(char** m)

}return s;

}char** to_map(string s)

for (int i = 0; i < s.length(); i++)

return map;

}void swap(char* a, char* b)

void bfs(string s, string e)

char** map = to_map(string_map);

int x = 0, y = 0;

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

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

swap(&map[tx][ty], &map[x][y]);

string tems = to_string(map);

if (hash[tems] == true)

hash[tems] = true;

que.push(make_pair(tems, step + 1));

swap(&map[tx][ty], &map[x][y]);}}

cout << -1;

return ;

}int main()

類似題目:

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

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

藍橋杯 試題 歷屆試題 九宮重排 BFS 剪枝

問題描述 如下面第乙個圖的九宮格中,放著 1 8 的數字卡片,還有乙個格仔空著。與空格子相鄰的格仔中的卡片可以移動到空格中。經過若干次移動,可以形成第二個圖所示的局面。我們把第乙個圖的局面記為 12345678.把第二個圖的局面記為 123.46758 顯然是按從上到下,從左到右的順序記錄數字,空格...

藍橋杯 歷屆試題 九宮重排

問題描述 如下面第乙個圖的九宮格中,放著 1 8 的數字卡片,還有乙個格仔空著。與空格子相鄰的格仔中的卡片可以移動到空格中。經過若干次移動,可以形成第二個圖所示的局面。我們把第乙個圖的局面記為 12345678.把第二個圖的局面記為 123.46758 顯然是按從上到下,從左到右的順序記錄數字,空格...