題目鏈結本題就類似於小遊戲拼圖,將九宮格中扣去一塊,可以導致拼圖可以移動,現在問你,給定乙個圖形,是否可以通過移動得到另一種形狀。如果可以,輸出最小步數,否則輸出-1。
首先我們可以看出,移動的方向,只能是上下左右四個方向移動,並且只可以將有數字(『1』 ~ 『8』)的位置移向空格(『.』)的位置。反過來可以看出,只有』.』可以上下左右四個方向移動。
我們可以把九宮格3*3的圖一維來表示。這裡如果基礎好的就可以直接跳過了。
如圖我們可以把所以我們就可以把乙個三維圖形用乙個字串表示,即乙個字串就可以表示乙個九宮格的狀態。3*3
的空間壓成1*9
的空間,這時候我們在三維空間中上下左右的移動,就可以在一維空間中,將下標值 -3,+3,-1,+1來表示。比如:1圖
空格
移動到6
的位置,就可以在2圖中將空格
向左移動3格即下標-3 就到了6
的位置
首先我的思路:步數最小,優先考慮廣搜,我們把開始的狀態通過題目中所規定的移動規則,不斷一層一層的搜尋,如果在搜尋的過程中找到了終止的狀態,那就直接輸出步數,注意邊搜尋邊標記,通過map
來對字串進行標記和查詢是否標記。
但是很不幸,tel超時了,只過了60%的資料。
考慮雙廣搜的思想,起點和終點一起搜尋,定義兩個map對映:m1、m2,分別表示起點狀態到當前狀態的步數和終點狀態到當前狀態的步數,一起搜尋的過程中,如果發現乙個狀態在m1和m2中都不為0,則把其對接一起。然後就a~啦,啊哈哈!
#include
#include
#include
#include
#include
#include
using
namespace
std;
map m1;
map m2;
typedef pair p;
int dir[4] = ;
string s, e; // s 代表起始, e 代表結束
bool judge(int x)
int bfs()
for(int i = 0; i < 4; ++ i)
}for(int i = 0; i < 4; ++ i)}}
return -1;
} int main()
藍橋杯 九宮重排
九宮重排 如下面第乙個圖的九宮格中,放著 1 8 的數字卡片,還有乙個格仔空著。與空格子相鄰的格仔中的卡片可以移動到空格中。經過若干次移動,可以形成第二個圖所示的局面。我們把第乙個圖的局面記為 12345678.把第二個圖的局面記為 123.46758 顯然是按從上到下,從左到右的順序記錄數字,空格...
藍橋杯 歷屆試題 九宮重排 (廣搜)
歷屆試題 九宮重排 時間限制 1.0s 記憶體限制 256.0mb 問題描述 如下面第乙個圖的九宮格中,放著 1 8 的數字卡片,還有乙個格仔空著。與空格子相鄰的格仔中的卡片可以移動到空格中。經過若干次移動,可以形成第二個圖所示的局面。我們把第乙個圖的局面記為 12345678.把第二個圖的局面記為...
C 藍橋杯 九宮重排
題目 如下面第乙個圖的九宮格中,放著 1 8 的數字卡片,還有乙個格仔空著。與空格子相鄰的格仔中的卡片可以移動到空格中。經過若干次移動,可以形成第二個圖所示的局面。我們把第乙個圖的局面記為 12345678.把第二個圖的局面記為 123.46758 顯然是按從上到下,從左到右的順序記錄數字,空格記為...