藍橋杯 歷屆試題 九宮重排

2021-10-22 05:54:29 字數 1229 閱讀 4631

題目描述

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

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

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

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

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

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

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

樣例輸入

12345678. 

123.46758

樣例輸出

3
思路:bfs+unordered_map判重。

分析:題目乍一看是乙個類似於走迷宮的題,但細看一下這道題與走迷宮是有些不同的。走迷宮是給出起點和終點,求起點到終點的最少步數,這道題也是求起點到終點的最少步數。

但是這道題是需要保證從起點走到終點後數字和給出的終態中的數字相同(例如圖中樣例起點到終點最少步數是3步,有兩條路線1.空格->8->5->4 ;2.空格->6->5->4;只有走第一條路線才能使九宮格的終態符合題設要求)。九宮格的始態和終態是以字串的格式給出的,所以我們在bfs的過程中也可以以字串格式儲存中間過程,這樣的話,如果在bfs過程**現了和終態一樣的九宮格狀態就說明存在最少步數,否則則不存在任何走法使九宮格始態變為終態。

那麼如何變換九宮格的狀態呢?

仔細觀察樣例圖可以發現,當將任意乙個數字移向空白塊時,字串中的.就會和對應的數字交換,可以根據這點來變換九宮格狀態。

**:

#includeusing namespace std;

typedef struct node

node;

node start,end;

int dx=;

int dy=;

unordered_maps;

void bfs()

); }}}

}cout>end.state;

bfs();

return 0;

}

藍橋杯 歷屆試題 九宮重排

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

藍橋杯 歷屆試題 九宮重排

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

藍橋杯 歷屆試題 九宮重排

bfs 查重 因為通過不同的路徑到達同乙個點會產生不同的串,不具有唯一性,所以查重不再是查詢乙個點到沒到過,而是找乙個中間串出沒出現過,set一下就行了 include include include include include include include include include i...