如下面第乙個圖的九宮格中,放著 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 顯然是按從上到下,從左到右的順序記錄數字,空格...