藍橋杯 PREV 19 九宮重排 雙廣搜

2021-08-17 12:33:45 字數 1495 閱讀 7053

題目鏈結

本題就類似於小遊戲拼圖,將九宮格中扣去一塊,可以導致拼圖可以移動,現在問你,給定乙個圖形,是否可以通過移動得到另一種形狀。如果可以,輸出最小步數,否則輸出-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 顯然是按從上到下,從左到右的順序記錄數字,空格記為...