歷屆試題 九宮重排

2021-10-02 11:44:05 字數 3017 閱讀 4629

問題描述

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

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

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

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

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

輸入格式

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

輸出格式

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

樣例輸入

12345678.

123.46758

樣例輸出

3樣例輸入

13524678.

46758123.

樣例輸出

22思路:學習大佬部落格passerbyorz

法一:雙向bfs+map去重 100 用時 78ms 藍橋杯

#include

#include

#include

#include

#include

using

namespace std;

const

int d[

2]=,

,,};

//上右下左

string origin;

//初始狀態

string dest ;

//最終狀態

mapint> vis;

mapint> step;

void

bfs(

) queue q1;

queue q2;

q1.push

(origin)

; vis[origin]=1

; step[origin]=0

; q2.

push

(dest)

; vis[dest]=2

; step[dest]=0

;while

(!q1.

empty()

||!q2.

empty()

)else

int pos;

for(

int i =

0; i

length()

; i++)if

(head[i]

=='.'

)int x = pos /3;

int y = pos %3;

for(

int i =

0; i<

4; i++

)else

if(vis[s]

+ vis[head]==3

)}}}

}int

main()

法二:雙向bfs+字典樹 100 用時31ms 藍橋杯

這我是真的酸,人家學了資料結構活學活用真的強,我嗚嗚嗚啥也不會!

#include

#include

#include

#include

#include

using

namespace std;

const

int d[

2]=,

,,};

//上右下左

string origin;

//初始狀態

string dest;

//最終狀態

typedef

struct node

}node;

class

trie

;trie::

trie()

int trie::

insert

(string s,

int flag,

int step)if(

!flag)

u = v;

} u-

>flag = flag;

u->step = step;

return success;

}node* trie::

find

(string s)if(

!flag)

return

null

; u = v;

}return u;

}trie trie;

void

bfs(

) queue q1;

queue q2;

q1.push

(origin)

; trie.

insert

(origin,1,

0); q2.

push

(dest)

; trie.

insert

(dest,2,

0);while

(!q1.

empty()

||!q2.

empty()

)else

int pos;

for(

int i =

0; i

length()

; i++)if

(head[i]

=='.'

)int x = pos /3;

int y = pos %3;

for(

int i =

0; i<

4; i++

)else

if(t-

>flag + h-

>flag ==3)

}}}}

intmain()

歡迎批評指正!

藍橋杯 歷屆試題 九宮重排

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

藍橋杯 歷屆試題 九宮重排

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

藍橋杯 歷屆試題 九宮重排

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